2009-11-10 87 views
7

我有一个字符串数组,我想通过LINQ添加到字符串生成器。LINQ从字符串追加到StringBuilder []

我基本上想说的是“对于此数组中的每个项目,将一行添加到此StringBuilder”。

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

stringArray.Select(x => stringBuilder.AppendLine(x)); 

凡为工作的:

foreach(String item in stringArray) 
{ 
    stringBuilder.AppendLine(item); 
} 
+0

我不会使用.Select命令...是不是可用的ForEach命令? – sebagomez 2009-11-10 14:21:44

+0

我已将StringBuilder和StringArray重命名为使用小写第一个字符。只是为了清楚说明我正在引用实例变量而不是类型。 – 2009-11-10 14:22:13

+0

是的,它是... http://msdn.microsoft.com/en-us/library/zecdkyw2.aspx :) – sebagomez 2009-11-10 14:23:32

回答

18

如果你坚持这样做的LINQy方式:

StringBuilder builder = StringArray.Aggregate(
          new StringBuilder(), 
          (sb, s) => sb.AppendLine(s) 
         ); 

此外,作为Luke在另一篇评论指出的那样,你可以说

Array.ForEach(StringArray, s => stringBuilder.AppendLine(s)); 

Select做的原因不工作是因为Select用于投影并创建投影的IEnumerable。所以代码

StringArray.Select(s => stringBuilder.AppendLine(s)) 

行不超过StringArray呼吁每个迭代stringBuilder.AppendLine(s)迭代。相反,它会创建一个可以列举的IEnumerable<StringBuilder>

我想你可以说

var e = stringArray.Select(x => stringBuilder.AppendLine(x)); 
StringBuilder sb = e.Last(); 
Console.WriteLine(sb.ToString()); 

但这确实是可怕的。

+0

谢谢Jason。你的回答解释了为什么Select方法没有达到我想要的结果以及为什么这个foreach正在工作。我会坚持使用foreach。我真的很好奇我错过了什么。现在我明白了。 – 2009-11-10 14:27:44

+0

是Last()保证迭代吗?而不是只是获取stringArray [stringArray.count-1]?我想我会更喜欢ToList(); – Taemyr 2017-05-08 14:46:43

0

StringArray.DoForAll(X => StringBuilder.AppendLine(X));

+0

什么是'DoForAll'? – jason 2009-11-10 14:21:46

+0

对不起,我已经有了这个扩展方法很久了,我忘了不是框架的一部分。 \t公共静态类CommonExtensions \t { \t \t公共静态无效DoForAll (这IEnumerable的项目,行动动作) \t \t \t其中T:类 \t \t { \t \t \t如果(动作== NULL ) \t \t \t \t throw new ArgumentNullException(“action”); \t \t \t的foreach(在项目VAR项目) \t \t \t \t行动(项目); \t \t \t \t}} – vladhorby 2009-11-10 14:37:11

+0

@vladhorby:为什么'DoForAll'和其他等效扩展没有实现一种观点:http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs -foreach.aspx – jason 2009-11-10 15:25:29

6

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

stringArray.ForEach(x => stringBuilder.AppendLine(x));