2011-08-23 33 views
0

我有一個List<string>,我正在迭代並分割每個項目,然後將其添加到StringBuilderC#編譯器如何與分割一起工作?

foreach(string part in List) 
{ 
    StringBuilder.Append(part.Split(':')[1] + " "); 
} 

所以我的問題是有多少字符串是通過做這個拆分創建的?所有的分割都會產生兩個項目。所以......我在想它會創建一個string[2]然後是一個空字符串。但是,它是否創建了string[1] + " "的連接,然後將其添加到StringBuilder或者這是優化的嗎?

+1

用ILDASM或Reflector檢查出來。 –

回答

5

的代碼實際上相當於此:

foreach(string part in myList) 
{ 
    sb.Append(string.Concat(part.Split(':')[1], " ")); 
} 

所以是,附加string,表示分割和空字符串的第二部分的級聯將被創建。

包括原始文件string,您還可以通過調用Split()創建兩個文件,並且引用文字字符串" ",該文件將從程序集元數據中加載。

您可以通過只Append調用保存自己Concat()荷蘭國際集團的拆分結果,併爲空字符串順序:

sb.Append(part.Split(':')[1]).Append(" "); 

請注意,如果你只使用字符串常量,那麼編譯器會讓一個optimzation爲您提供:

sb.Append("This is " + "one string"); 

實際上被編譯到

sb.Append("This is one string"); 
3

你有原始字符串「分裂」 - 1串

你的「分裂」分裂成兩個 - 2串

你有分裂的兩個部分連接 - 1串

字符串生成器不會創建新的字符串。

當前代碼使用4個字符串,包括原始字符串。

如果你想保存一個字符串做:

StringBuilder.Append(part.Split(':')[1]); 
StringBuilder.Append(" "); 
1

也許只有這樣,才能知道這是如何編譯是建立它與重構重新編譯它,看看它是如何進行內部處理。無論如何請記住,它可能不會影響整個應用程序的性能。

2

此代碼:

foreach(string part in List) 
{ 
    StringBuilder.Append(part.Split(':')[1] + " "); 
} 

等同於:

foreach(string part in List) 
{ 
    string tmp = string.Concat(part.Split(':')[1], " "); 
    StringBuilder.Append(tmp); 
} 

所以,是的,它是不必要創建一個字符串。這將是更好的,至少在生成的字符串的數量而言:你分配

foreach(string part in List) 
{ 
    StringBuilder.Append(part.Split(':')[1]) 
       .Append(" "); 
} 
2

所以對於列表中的每個值(n,在你的代碼被稱爲part):

  1. x(我假設2)字符串的分裂。
  2. n串聯字符串。
  3. 粗略地n + 1字符串爲StringBuilder;雖然可能少得多。

所以,你必須nx + n + n + 1末,並假設分裂總是導致兩個值4n + 1。改善這種

一種方法是:

foreach(string part in List) 
{ 
    var val = part.Split(':')[1]; 
    StringBuilder.EnsureCapacity(StringBuilder.Length + val.Length + 1); 
    StringBuilder.Append(val); 
    StringBuilder.Append(' '); 
} 

這使得3n + 1。這是一個粗略的估計,因爲StringBuilder會在空間不足的情況下分配字符串 - 但是如果您使用EnsureCapacity,則會阻止其從錯誤。對於每一個項目

  • part[0];
  • part[1];
  • part[1] + " "

最少的分配可能

4

3個額外的字符串是避免所有的臨時撥款完全,但通常的微優化注意事項適用。

var start = part.IndexOf(':') + 1; 
stringbuilder.Append(part, start, part.Length-start).Append(' ');