2009-10-12 80 views
3

如果我想連接一個字符串N次,我應該選擇哪種方法?用於N次迭代的字符串連接方法?

拿這個代碼爲例:

public static string Repeat(this string instance, int times) 
{ 
     var result = string.Empty; 

     for (int i = 0; i < times; i++) 
      result += instance; 

     return result; 
} 

這種方法可以用「時間」設置爲5,或5000,我應該喜歡什麼方法使用調用?

string.Join? StringBuilder的?只是標準的string.Concat?

類似的功能將在商業圖書館實施,所以我真的需要「最佳」的方式來做到這一點。

回答

8
public static string Repeat(this string instance, int times) 
    { 
     if (times == 1 || string.IsNullOrEmpty(instance)) return instance; 
     if (times == 0) return ""; 
     if (times < 0) throw new ArgumentOutOfRangeException("times"); 
     StringBuilder sb = new StringBuilder(instance.Length * times); 
     for (int i = 0; i < times; i++) 
      sb.Append(instance); 
     return sb.ToString(); 
    } 
+0

謝謝你,你已經證明了你的一個好方法。 – alexn 2009-10-12 06:36:51

+1

爲什麼不在第4行返回string.Empty? – 2009-10-12 06:46:21

+0

「」是string.Empty,從MSDN開始:[該字段的值是零長度字符串,「」] [1]。 [1]:http://msdn.microsoft.com/en-us/library/system.string.empty。aspx – 2009-10-12 06:49:05

5

Stringbuilder ofcourse。它用於快速字符串連接操作,因爲每次要連接字符串時都不會創建新對象。

詳情請參閱here

2

StringBuilder。

「result + = result;」

每次您執行賦值時都會創建一個新字符串,並將該新字符串分配給您的變量,因爲字符串是不可變的。

用StringBuilder去,肯定。

2

永遠不要假設一種方法比另一種方法更快 - 您必須一直測量兩者的性能,然後再決定。令人驚訝的是,對於較小數量的迭代,僅使用標準字符串連接(result + = string)通常比使用字符串生成器更快。如果你知道迭代次數總是相同的(例如它總是50次迭代),那麼我建議你使用不同的方法進行一些性能測量。

如果你真的要弄巧,使性能測量對迭代次數,您可以找到「交叉點」,其中一個方法比另一種速度更快,硬編碼門檻進入方法:

if(iterations < 30) 
{ 
    CopyWithConcatenation(); 
} 
else 
{ 
    CopyWithStringBuilder(); 
} 

確切的性能交叉點將取決於您的代碼的具體細節,如果不進行性能測量,您將永遠無法找到它們。爲了使事情複雜一點,StringBuilder有'整齊的'內存管理,即字符串連接(它創建更多的臨時實例),因此這可能會影響字符串循環外部的整體性能(如下次垃圾收藏家運行)。

讓我們知道你是如何得到的。

+0

偉大的洞察力,謝謝 – HXCaine 2010-12-31 19:56:04