如何ConvertListToString(extensions)用优雅的LINQ语句替换?
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 17
var s = string.Join(", ", files.Select(file => Path.GetExtension(file))
.Distinct(StringComparer.InvariantCultureIgnoreCase).ToArray());
Run Code Online (Sandbox Code Playgroud)
ang*_*son 15
这是如何做:
String s = String.Join(", ", (from extension in extensions select extension.ToUpper()).ToArray());
Run Code Online (Sandbox Code Playgroud)
注意,我可能不会把它写成一行,而是这样:
String s = String.Join(", ",
(from extension in extensions
select extension.ToUpper()).ToArray());
Run Code Online (Sandbox Code Playgroud)
如果你不介意直接使用Linq扩展方法,而不是Linq查询语法,你可以使用:
String s = String.Join(", ", extensions.Select(e => e.ToUpper()).ToArray());
Run Code Online (Sandbox Code Playgroud)
另一种变体是只调用ToUpper最后一个字符串:
String s = String.Join(", ", extensions.ToArray()).ToUpper();
Run Code Online (Sandbox Code Playgroud)
最后,在.NET 4.0中,String.Join最终IEnumerable<String>直接支持,所以这是可能的:
String s = String.Join(", ", extensions).ToUpper();
Run Code Online (Sandbox Code Playgroud)
请注意,根据您的问题,这可能会导致重复.考虑如果您的原始文件名列表包含两者"filename.txt",将会发生什么"filename.TXT",这些将被视为两个不同的扩展.
在调用ToUpper之前应该调高调用Distinct以解决此问题.
而不是原来的Linq表达式+代码,我会重写整个事情:
String[] distinctExtensions = files
.Select(fileName => Path.GetExtension(fileName).ToUpper())
.Distinct()
.ToArray();
String distinctExtensionsAsString = String.Join(", ", distinctExtensions);
Run Code Online (Sandbox Code Playgroud)
如果将以下实用程序方法添加到代码库中,则可以进一步简化它:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
然后你的代码看起来像这样:
String distinctExtensionsAsString = files
.Select(fileName => Path.GetExtension(fileName).ToUpper())
.Distinct()
.Join(", ");
Run Code Online (Sandbox Code Playgroud)