2011-03-29 43 views
3
 string c = tmpArr[0].Aggregate(string.Empty, (current, m) => current + (m.Name + " ")); 

     StringBuilder sb = new StringBuilder(); 

     foreach (Mobile m in tmpArr[0]) 
      sb.Append(m.Name + " "); 

     sb.ToString(); 

這兩個哪個更快?總肯定是清潔的,但它是快還是一樣做StringBuilder真的比Aggreggate更快嗎?

foreach(Mobile m in tmpArr[0]) 
    c += m.Name + " "; 

我真的想要做什麼是一樣的東西string.Join(",",tmpArr[0]),但我不希望它Concat的自己的ToString值,只是他們名字,我會如何做到最好?

我的問題,不使用string.Join是我真的不得不做這樣的事情:如果你在一個循環中添加字符串(c += m.Name + " ";

 string separator = ""; 
     StringBuilder sb = new StringBuilder(); 

     foreach (Mobile m in tmpArr[0]) 
     { 
      separator = ", "; 
      sb.Append(separator + m.Name); 
     } 
+9

你測試了嗎?你的結果是什麼決定的? – 2011-03-29 13:47:08

+1

你期望有多少元素?如果它不是很多,速度就不會像代碼的清潔一樣重要。根據大小找出最糟糕的情況,測量結果,確定哪些折衷是可接受的。 – 2011-03-29 13:54:50

+0

-1,此外,它甚至重要嗎?除非你有10-20,000個名字連接在一起,否則我懷疑你會注意到有什麼不同。 – user7116 2011-03-29 13:55:06

回答

10

我不想它連接他們的ToString值,只是他們的名字,我怎麼做最好?

string.Join(",",tmpArr[0].Select(t => t.Name).ToArray()) 

但大部分時間It. Just. Doesn't. Matter!

+0

這正是我所期待的。謝謝! – bevacqua 2011-03-29 13:56:06

+0

+1文章 – 2011-03-29 13:58:36

+0

ToArray在.net 4中是不需要的。過載需要IEnumerable spender 2011-03-29 13:59:54

12

你造成很多要創建中間串;這會導致「伸縮」的內存使用,並給GC帶來額外負擔。聚合,與StringBuilder的流暢API混合可以在這裏幫助 - 但是會像使用StringBuilder循環一樣。這不是重要的聚合:它是不創建大量的中間字符串

例如,我會用:

foreach (Mobile m in tmpArr[0]) 
     sb.Append(m.Name).Append(" "); 

甚至更​​少,P

以及在碎石StringBuilder的一個類似的例子:

string c = tmpArr[0].Aggregate(new StringBuilder(), 
    (current, m) => current.Append(m.Name).Append(" ")).ToString(); 
1

Aggregate本身是沒有問題的。問題是你在一個循環中連接字符串。當你使用+運算符連接兩個字符串時,必須在內存中分配一個新位置,並將兩個字符串複製到該位置。所以如果你五次使用+,你實際上創建了五個新的字符串。這就是爲什麼你應該使用StringBuilderJoin這避免了這一點。

如果你想使用Join使用LINQ沿着更好的可讀性,你仍然可以,只是不要用Aggregate但類似SelectToArray

1

由於字符串不可變,添加操作具有性能成本。這是StringBuilder主要爲其設計的,它的作用類似於「可變」字符串。我沒有爲速度做很多基準測試,但是對於內存優化來說,StringBuilder肯定更好。

1

AggregateIEnumerable中的每個項目運行匿名方法。該方法被傳遞給系統定義的Func<>委託,該委託返回一個out參數。

它基本上就像運行一個函數一樣可以追加多次。

所以棧的方法上分配/釋放調用等肯定有比運行一個簡單的for/foreach

所以,在我看來第二種方法會更快更多的開銷。

1

是這樣的嗎?

string joined = string.Join(",", myItems.Select(x => x.Name).ToArray());