如何将这个12行方法转换为1行LINQ表达式?

Edw*_*uay 3 c# linq

如何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)

  • 这是一个比我更好的答案,因为它用Linq取代了他原来的更多代码,而不仅仅是回答他的确切问题.我的投票在这里. (2认同)
  • 错误!它是2行. (2认同)

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)