如何使用 Linq Aggregate 函数将 IEnumerable<string> 聚合为字符串

Ita*_*vin 0 aggregate linq-to-sql

我有一个Ienumerable<string>集合,我想用分隔符连接成一个字符串;

例如 {"One","Two","Three"} -> "One;Two;Three;"

是否可以使用以下功能?

List<string> list = new List<string>(){"One","Two","Three"};
list.Aggregate<String>((x,y) => x + String.Format("{0};",y));
Run Code Online (Sandbox Code Playgroud)

我也试过这个代码:

list.Aggregate<String>((x,y) => String.Format("{0};{1}",x,y)); 
Run Code Online (Sandbox Code Playgroud)

两个样品都不起作用。

编辑:我发现使用 Linq-2-sql 或 Linq-2-sql 中的聚合函数无法执行我想要的操作。

http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/dac496c0-5b37-43ba-a499-bb8eff178706/

EDIT2:我使用的解决方法是检查原始 linq 查询返回的项目......并将它们复制到一个新列表,并按照下面的 linq 对象而不是 linq-2-sql 对象的答案中的建议进行连接.

Luk*_*keH 5

您可以仅用String.Join于此目的。如果您使用的是 .NET4,那么您可以使用直接接受一个的重载IEnumerable<string>

string joined = string.Join(";", list);
Run Code Online (Sandbox Code Playgroud)

如果您使用的是旧版本的框架,那么您将需要使用string[]数组的重载,如有必要,首先将您的集合转换为数组:

string joined = string.Join(";", list.ToArray());
Run Code Online (Sandbox Code Playgroud)

编辑...

当然,如果您Aggregate出于某种原因真的想使用,那么没有什么可以阻止您。如果是这样,通常建议使用 aStringBuilder而不是多个字符串分配来构建您的字符串:

string joined = list.Aggregate(new StringBuilder(),
                               (sb, s) => sb.Append(s).Append(';'),
                               sb => (sb.Length > 0) ? sb.ToString(0, sb.Length - 1)
                                                     : "");
Run Code Online (Sandbox Code Playgroud)