Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将此12行方法转换为1行LINQ表达式?_C#_Linq - Fatal编程技术网

C# 如何将此12行方法转换为1行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[

如何用优雅的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[] 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();
}