2009-11-10 93 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));