2014-02-28 388 views
1

我有一個字符串替換字符串字符

"#1#+#2#+#3#*1.23+#4#/2+#5#" 

我有對象的列表作爲

  • 1, 「ABC」
  • 2, 「DEF」
  • 3,「 GHI「
  • 4,」JKL「
  • 5,」MNO「

我需要一個新字符串,其中的#1#替換爲 「ABC」,#2#與DEF等替代

所需的字符串:

"ABC+DEF+GHI*1.23+JKL/2+MNO" 

如何獲得替換有效執行?

編輯:目前我正在循環爲列表中的每個和使用替換字符串,但我相信它不是非常有效的內存。一定會有更好的辦法。

+1

迭代你的列表並調用每個項目的'string.Replace'如何?你嘗試過嗎?你嘗試過別的嗎? – Jon

+0

@Jon _effectively_是關鍵詞。多次替換導致多個臨時字符串,並且由於垃圾收集導致內存和CPU的大量浪費。 –

+3

爲什麼不用.NET的佔位符替換#1#,例如{0},{1}?在這種情況下,您可以簡單地使用String.Format來執行替換 –

回答

-1

兩個答案:

  1. 簡單。對列表中的每個對象使用string.Replace(...)方法。但是對於有很多替換的長字符串,它會變慢。
  2. 創建StringBuilder。迭代你的字符串複製字符到stringbuilder,直到遇到替換子字符串。在StringBuilder中插入替換對象並繼續迭代您的輸入字符串。返回StringBuilder.ToString()
+0

StringBuilder也有一個Replace函數,但它只是改變自己而不是創建新的副本。 –

+0

@ColinMackay如果StringBuilder在替換之前沒有足夠的容量,它會在每次容量耗盡時複製它內部的字符串。 – Redwan

+0

是的,但它不會*每*次。應用更多容量的算法會過度提供新容量,以便下次不一定需要執行復制。如果要通過合併格式字符串和每個替換字符串的長度來完成一些額外的工作,您還可以在創建StringBuilder時指明容量,在這種情況下,不需要複製其內部緩衝區到一個新的更大的緩衝區。 –

0

從數據庫中讀取此行。閱讀並更改#爲{或}。如果是第一個#,那麼{,如果它是第二個},依此類推。那麼結果會像下面的文本變量;)

string text = "{0}+{1}+{2}*1.23+{3}/2+{4}"; 

和你有一個數組:

string[] replaces = {"ABC", 
"DEF", 
"GHI", 
"JKL", 
"MNO"}; 

你可以做soemthing,如:

string result = string.Format(text, replaces); 
+1

第一個字符串來自數據庫,所以我不建立它。但是,我可能會在這裏直接獲取數據庫的更改。這些整數的順序並不總是0,1,2 ...但可以是任何東西 – Nuts

+0

然後是構建總是相同的方式,你可以做一些類似的,用int,然後讀取字符串,如果是第一個#你發現,改變{,如果是第二次改變},等等,那麼最終的輸出將會像我的答案中的「文本」;) –

1

如果性能不是一個大問題,你可能想要使用正則表達式:

string input = "#1#+#2#+#3#*1.23+#4#/2+#5#"; 
var replaces = new List<string> { "ABC", "DEF", "GHI", "JKL", "MNO" }; 

string result = Regex.Replace(input, "#[0-9]+#", match => 
{ 
    string number = match.Value.Substring(1, match.Value.Length - 2); 
    int index = int.Parse(number) - 1; 
    return replaces[index]; 
}); 

它的工作原理「#」之間,即使數字:

  • 不是爲了
  • 出現多次
  • 有一個以上的數字

之間的數量N' #'必須對應於replaces列表中的第(N-1)個索引。 您可能想要添加一些錯誤處理。