2009-04-13 70 views
1

我正在嘗試創建一個實用程序方法來在模板文件上執行類似郵件合併的功能。由於字符串是不可變的,我不確定我是否正確寫入 - 是否有人可以一目瞭然並給我反饋?優化我的方法

public static string LoadTemplateFile(string fileName, 
             NameValueCollection mergeFields) 
{ 
    string result = System.IO.File.ReadAllText(fileName); 

    if (mergeFields != null) 
    { 
     for (int index = 0; index < mergeFields.Count; index++) 
     { 
      result = result.Replace(mergeFields.Keys[index], 
            mergeFields[index]); 
     } 
    } 

    return result; 
} 
+0

優化內存使用情況或性能? – 2009-04-13 15:19:06

+0

效率。我正在使用JaredPar的方法。 – 2009-04-13 15:20:45

+0

是否所有的密鑰都有相同的相似前綴?對此進行拆分,然後檢查每個子字符串,根據需要進行替換,然後加入。需要多次嵌套鍵傳遞。 – 2009-04-13 15:36:45

回答

4

它看起來像你正試圖

  1. 從磁盤讀取
  2. 文件執行搜索/基於所提供的名稱/值映射

上取代如果是這樣的那麼是的,這將工作得很好。

我唯一真正的反饋是,取決於替換名稱/值對的數量,您將創建大量的臨時字符串。這對於小文件來說可能很好,但是一旦你開始將相對較大的文件加載到應用程序中,您可能會看到明顯的差異。

更好的方法是使用StringBuilder並對該對象執行Replace調用。這將減少不必要的臨時字符串的創建。

+0

我從來沒有想過使用StringBuilder的Replace方法。當我使用StringBuilders時,我通常從頭創建一個字符串。感謝您的解釋! – 2009-04-13 15:19:08

+0

不知道爲什麼以後的答案沒有代碼被標記,但很高興你得到它修復! – 2009-04-13 15:20:48

+0

@亞當 - 這很奇怪 - 我拉起了傑瑞德的迴應,我沒有看到你的。抱歉! – 2009-04-13 15:46:46

10

你可能會更好地使用StringBuilder而不是字符串。

public static string LoadTemplateFile(
    string fileName, NameValueCollection mergeFields) 
{  
    System.Text.StringBuilder result = new System.Text.StringBuilder(
     System.IO.File.ReadAllText(fileName)); 

    if (mergeFields != null) 
    { 
     for (int index = 0; index < mergeFields.Count; index++) 
     { 
      result.Replace(mergeFields.Keys[index], 
            mergeFields[index]); 
     } 
    } 

    return result.ToString(); 
} 
+0

我看不到任何字符串連接,爲什麼使用StringBuilder? – 2009-04-13 15:18:32

+0

由於操作發生的StringBuilder通常更快,因爲它維護自己的內部緩衝區,所以你可能會也可能不會創建中間字符串,而你保證使用string.Replace() – 2009-04-13 15:19:35

+0

我猜測StringBuilder.Replace和String.Replace的工作方式不同:即:返回字符串的String和StringBuilder內部修改的字符串 – 2009-04-13 15:20:36

1

使用StringBuilder而不是字符串。這是我唯一的建議,它的方式更快。