C# 如何将此12行方法转换为1行LINQ表达式?
如何用优雅的LINQ语句替换C# 如何将此12行方法转换为1行LINQ表达式?,c#,linq,C#,Linq,如何用优雅的LINQ语句替换ConvertListToString(扩展) using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestExtn2343 { class Program { public static void Main(string[] args) { string[
ConvertListToString(扩展)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestExtn2343
{
class Program
{
public static void Main(string[] args)
{
string[] files = { "test.txt", "test2.txt",
"test.as", "notes.doc",
"data.xml", "test.xml",
"test.html", "notes.txt",
"test.xls" };
List<string> extensions = (from file in files
let index = file.LastIndexOf('.') + 1
select file.Substring(index)).Distinct().ToList<string>();
Console.WriteLine("The kinds of file extensions used are {0}.", ConvertListToString(extensions));
Console.ReadLine();
}
public static string ConvertListToString(List<string> list) {
StringBuilder sb = new StringBuilder();
int count = 1;
foreach (var listItem in list)
{
sb.Append(listItem.ToUpper());
if (count != list.Count)
sb.Append(", ");
count++;
}
return sb.ToString();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间TestExtn2343
{
班级计划
{
公共静态void Main(字符串[]args)
{
字符串[]文件={“test.txt”,“test2.txt”,
“test.as”、“notes.doc”,
“data.xml”、“test.xml”,
“test.html”、“notes.txt”,
“test.xls”};
列表扩展名=(来自文件中的文件)
让index=file.LastIndexOf('.')+1
选择file.Substring(index)).Distinct().ToList();
WriteLine(“使用的文件扩展名类型是{0}.”,ConvertListToString(扩展名));
Console.ReadLine();
}
公共静态字符串ConvertListToString(列表){
StringBuilder sb=新的StringBuilder();
整数计数=1;
foreach(列表中的var listItem)
{
sb.Append(listItem.ToUpper());
if(count!=list.count)
某人加上(“,”);
计数++;
}
使某人返回字符串();
}
}
}
以下是方法:
String s = String.Join(", ", (from extension in extensions select extension.ToUpper()).ToArray());
请注意,我可能不会把它写成一行,而是这样写的:
String s = String.Join(", ",
(from extension in extensions
select extension.ToUpper()).ToArray());
String distinctExtensionsAsString = files
.Select(fileName => Path.GetExtension(fileName).ToUpper())
.Distinct()
.Join(", ");
如果您不介意直接使用Linq扩展方法,而不是Linq查询语法,您可以使用以下方法:
String s = String.Join(", ", extensions.Select(e => e.ToUpper()).ToArray());
另一种变体是只对最后一个字符串调用ToUpper
:
String s = String.Join(", ", extensions.ToArray()).ToUpper();
最后,在.NET 4.0中,String.Join
最终直接支持IEnumerable
,因此这是可能的:
String s = String.Join(", ", extensions).ToUpper();
请注意,根据您的问题,这可能会导致重复。考虑如果原始文件名列表包含“代码>文件名.txt”和“代码> >文件名.txt”<代码>将发生什么,这些将被视为两个不同的扩展。
对ToUpper
的调用应在调用Distinct
之前上移,以解决此问题
我会将整个过程重写为以下内容,而不是原始的Linq表达式+代码:
String[] distinctExtensions = files
.Select(fileName => Path.GetExtension(fileName).ToUpper())
.Distinct()
.ToArray();
String distinctExtensionsAsString = String.Join(", ", distinctExtensions);
如果将以下实用程序方法添加到代码库中,则可以进一步简化:
public static class StringExtensions
{
public static String Join(this IEnumerable<String> elements, String separator)
{
if (elements is String[])
return String.Join(separator, (String[])elements);
else
return String.Join(separator, elements.ToArray());
}
}
这个怎么样:
String output = String.Join(", ",(from file in files
let index = file.LastIndexOf('.') + 1
select file.Substring(index)).Distinct().ToArray<string>());
String output=String.Join(“,”,(从文件中的文件)
让index=file.LastIndexOf('.')+1
选择file.Substring(index)).Distinct().ToArray();
这个怎么样
public static string ConvertListToString(List<string> list)
{
return list.Aggregate((x, y) => x + ", " + y).ToUpper();
}
公共静态字符串ConvertListToString(列表)
{
return list.Aggregate((x,y)=>x+”,“+y).ToUpper();
}
这是在一行中完成的,我将“ToUpper”移到了最后一个字符串上,所以它只被调用一次
显然,如果您愿意,您可以放弃ConvertListToString和inline方法。这是一个比我更好的答案,因为这将用Linq替换他更多的原始代码,而不仅仅是回答他确切的问题。请注意,这也是一个很好的例子,说明为什么尽快接受答案不是一个好主意。相反,即使你很早就决定了你自己想用哪一个答案,也要把问题留一段时间,看看更好的答案是否会浮出水面;扩展部分应该是大写的。还要注意的是
file=>Path.GetExtension(file)
比Path.GetExtension
@Porges更好——试试看-p如果使用Path.GetExtension,则需要显式指定泛型。
public static string ConvertListToString(List<string> list)
{
return list.Aggregate((x, y) => x + ", " + y).ToUpper();
}