2011-05-29 61 views
19

可能重複:
What's the best string concatenation method using C#?做字符串連接快於C#

嗨,

我有一個代碼段像這樣在數據的大量內容是從讀文件並檢查每個位置的某個值並將其串起來。

該字符串連接需要大量的時間和處理能力。有沒有一種方法可以減少執行時間?

重要:在閱讀內容文件語法不正確只需要給一個想法

string x; 

while (var < File.Length) 
{ 
    if (File.Content[var] == "A") 
    { 
     x += 1;  
    } 
    else 
    { 
    x += 0; 
    } 
    var++; 
} 
+1

http://stackoverflow.com/questions/21078/whats-the-best-string- concatenation-method-using-c – 2011-05-29 04:55:16

+10

-1:將來,提供一個更接近於你實際正在做的事情(實際上是C#)的代碼示例將有助於答覆者寫出比超過一般的'使用'StringBuilder'」。例如,你是如何閱讀文件的,你是否真的在檢查每個字符,你串聯的字符串是否真的是單個字符等。 – 2011-05-29 05:37:23

回答

28

使用StringBuilder而不是字符串連接。

一個StringBuilder對象維護一個緩衝區以適應新數據的連接。如果空間可用,新數據將附加到緩衝區的末尾;否則,將分配一個新的更大的緩衝區,將原始緩衝區中的數據複製到新緩衝區中,然後將新數據附加到新緩衝區中。

字符串相反是不可變的,每次連接時它會創建一個新對象並丟棄舊對象,這是非常低效的。

另外,如果您知道結果將會很大,您可能需要提前爲StringBuilder設置高容量。這將減少緩衝區重新分配的次數。

以你的僞代碼將是這樣的:

StringBulder x = new StringBuilder(10000); // adjust capacity to your needs 

while (var < File.Length) 
{ 
    if(File.Content[var] == "A") 
     x.Append("1"); // or AppendLine, or AppendFormat 
    else 
     x.Append("2"); 
} 
+0

非常感謝你的回答 – Sudantha 2011-05-29 05:00:39

+0

實際上是投票計數! – Sudantha 2011-05-29 05:08:57

+3

@Sudantha:因爲聽起來好像你是StringBuilder的新手,可能值得一提的是,只有在進行「多次」連接時纔有用。 – Niklas 2011-05-29 06:15:43

7

使用StringBuilder相反,將執行好得多 - 使用字符串創建一個新的字符串,它會導致很多的環路內的各時間開銷/垃圾收集,使用您在循環外部創建的單個StringBuilder可以避免這種情況。

19

System.Text.StringBuilder是您希望用於循環中字符串連接操作的類型。這將會更有效率。在每次迭代期間在對象上使用.Append(value)

StringBuilder builder = new StringBuilder(); 

// and inside your loop 
{ 
    if (blah) 
     builder.Append("1"); 
    else 
     builder.Append("0"); 
} 

string output = builder.ToString(); // use the final result 
+0

感謝您的答案我認爲你是正確的答案給亞歷克斯:) – Sudantha 2011-05-29 05:09:39

6

使用StringBuilder。

var sb = new StringBuilder(); 
sb.Append("abc"); 
sb.Append("def"); 
var str = sb.ToString(); 
7

使用StringBuilder,字符串在.net中是不可變的,意思是任何連接都會生成字符串的副本。

Using the StringBuilder Class (MSDN)

StringBuilder sb = new StringBuilder(); 
sb.Append("1") // like so 
1

當你讀通過字節文件字節,它可以花費太長的時間。我建議你在循環中讀取一個字節塊(例如1024或2048)。然後,在你讀過的塊中,使用正則表達式來匹配你的角色,特別是如果你有一個非常大的文件。

示例代碼將是這樣的:

private string GetFileData(string fileName, string matchChar) 
{ 
    StringBuilder x = new StringBuilder(); 
    int blockCount = 2048; 
    int offset = 0; 
    string pattern = matchChar; 
    int k = -1; 
    using (var sr = new System.IO.FileStream(fileName, System.IO.FileMode.Open)) 
    { 
     while ((sr.CanRead) && (k != 0)) 
     { 
      byte[] bt = new byte[blockCount]; 
      k = sr.Read(bt, 0, blockCount); 
      string so = System.Text.UTF8Encoding.UTF8.GetString(bt); 
      var m = new System.Text.RegularExpressions.Regex(pattern).Matches(so); 
      foreach (System.Text.RegularExpressions.Match item in m) 
      { 
       x.Append(item.Value); 
      } 
     } 
    } 
    return x.ToString(); 
} 

你會稱這個爲

GetFileData(@"c:\matchtest.ono", "a");