LINQ从String []附加到StringBuilder

Jam*_*xon 6 c# linq lambda stringbuilder

我有一个String数组,我想通过LINQ添加到字符串生成器.

我基本上想说的是"对于这个数组中的每个项目,在这个StringBuilder中附加一行".

我可以使用foreach循环很容易地做到这一点但是下面的代码似乎没有做任何事情.我错过了什么?

stringArray.Select(x => stringBuilder.AppendLine(x));
Run Code Online (Sandbox Code Playgroud)

这工作的地方:

foreach(String item in stringArray)
{
  stringBuilder.AppendLine(item);
}
Run Code Online (Sandbox Code Playgroud)

jas*_*son 18

如果您坚持以LINQy方式执行此操作:

StringBuilder builder = StringArray.Aggregate(
                            new StringBuilder(),
                            (sb, s) => sb.AppendLine(s)
                        );
Run Code Online (Sandbox Code Playgroud)

另外,正如卢克在另一篇文章的评论中指出的那样,你可以说

Array.ForEach(StringArray, s => stringBuilder.AppendLine(s));
Run Code Online (Sandbox Code Playgroud)

Select不起作用的原因是因为Select投影和创建IEnumerable投影.所以代码行

StringArray.Select(s => stringBuilder.AppendLine(s))
Run Code Online (Sandbox Code Playgroud)

不会迭代每次迭代的StringArray调用stringBuilder.AppendLine(s).相反,它创建了一个IEnumerable<StringBuilder>可以枚举的内容.

我想你可以说

var e = stringArray.Select(x => stringBuilder.AppendLine(x));
StringBuilder sb = e.Last();
Console.WriteLine(sb.ToString());
Run Code Online (Sandbox Code Playgroud)

但那真是太可怕了.


sco*_*udy 8

使用“ForEach”扩展方法而不是“Select”。

stringArray.ToList().ForEach(x => stringBuilder.AppendLine(x));
Run Code Online (Sandbox Code Playgroud)

或者

Array.ForEach(stringArray, x => stringBuilder.AppendLine(x));
Run Code Online (Sandbox Code Playgroud)