簡體   English   中英

C#如果字符串列表中包含文本,則替換為

[英]C# Replace a text in string with if the text contains in String list

我試圖用Dictionary Value替換字符串中的文本,如果它與Dictionary Key相匹配。 從Table1中選擇*,其中column1 = {Value1}和Column2 = {value2}。

mydict.Add({value1},OriginalValue1);
mydict.Add({value2},OriginalValue2);

我可以遍歷字典鍵並替換字符串中的文本,例如,但是如果Dictionary對象中有100多個項目,這將影響性能。

foreach(string key in mydict.keys)
{
if(Query.Contains(key)
{
 //Replace the string
}

有沒有辦法做到這一點而對性能的影響最小?

只是速度和字典性能的一個示例。 這是4歲的i7-3820的一個線程

  • 在時間0毫秒的字符串“某些11998948輸入”中找到1
  • 在時間0ms中在字符串“某些11998948輸入”中找到4
  • 在1ms的時間中在字符串“某些11998948輸入”中找到8
  • 在1ms的時間中在字符串“某些11998948輸入”中找到9
  • 在時間1毫秒內發現字符串“大約11998948輸入”中的11
  • 在1ms的時間中發現字符串“某些11998948輸入”中的19
  • 在1ms的時間內發現字符串“大約11998948輸入”中的48個
  • 在1ms的時間內發現字符串“大約11998948輸入”中的89
  • 在1ms的時間內發現字符串“大約11998948輸入”中的94
  • 在1ms的時間內發現字符串“大約11998948輸入”中的98
  • 在1ms的時間中發現字符串“某些11998948輸入”中的99
  • 在1ms的時間中找到字符串119“一些11998948輸入”
  • 在1ms的時間內找到字符串199“某些11998948輸入”
  • 在1ms的時間內發現字符串894“一些11998948輸入”
  • 在2ms的時間內以字符串“某些11998948輸入”找到948
  • 在2ms的時間內在字符串“大約11998948輸入”中找到989
  • 在2ms的時間內發現字符串998為“一些11998948輸入”
  • 在2ms的時間內發現字符串“大約11998948輸入”中的1199
  • 在時間2ms中以字符串“大約11998948輸入”的形式找到1998年
  • 在3ms的時間內發現字符串“大約11998948輸入”中的8948
  • 在3ms的時間內發現9894的字符串“大約11998948輸入”
  • 在3ms的時間內在字符串“ some 11998948 input”中找到9989
  • 在4ms的時間內發現字符串“ 11998948輸入”中的11998
  • 在5ms的時間中以字符串“ some 11998948 input”找到19989
  • 在21ms的時間中發現字符串“大約11998948輸入”中的98948
  • 在21ms的時間內以字符串“ some 11998948 input”找到了99894
  • 在25ms的時間中找到字符串“大約11998948輸入”中的119989
  • 在42ms內以字符串“大約11998948輸入”找到了199894
  • 在時間214ms中以字符串“某些11998948輸入”找到998948
  • 在255ms的時間中在字符串“ some 11998948 input”中找到1199894
  • 在400ms的時間中以字符串“大約11998948輸入”找到了1998948
  • 在時間2127ms中以字符串“某些11998948輸入”找到11998948

這意味着要遍歷約1200萬個元素大約需要2秒鍾。 字典不是你的問題。 (但我認為部分匹配可能會)

我用這段代碼來運行它。

Dictionary<string, string> dic = new Dictionary<string, string>();
for (int i = 0; i < 11998949; i++) //11998949 is max supported range
{
    dic.Add(i.ToString(), i.ToString());
}

Stopwatch sw = new Stopwatch();
sw.Start();
string Query = "some 11998948 input"; 
foreach(var a in dic.Where(a=> Query.Contains(a.Key)))
{
    Console.WriteLine($"Found {a.Key} in string {Query} in time {sw.ElapsedMilliseconds}ms");
}
Console.ReadKey();

首先警告:不要在了解性能實際問題之前就把事情復雜化,以求優化。 對我來說100個替代品聽起來並不重要。 通常,代碼的可讀性和解決實際問題所花費的時間比節省10ns的代碼具有更大的價值。

假設每納秒真的很重要,那么您應該測量基准並考慮改進方案:

  • 從內置的簡單工具(如String.Replace() 它們通常在內部比您自己可以做的更好(除非您知道一些對輸入或所需行為的重要限制)
  • 替換之前不要做多余的Contains(key) ,因為無論如何您都需要搜索確切的位置進行替換。 或者,如果您選擇處理索引,則可以像使用String.IndexOf(..)一樣重用第一遍。
  • 如果您的密鑰具有相似的可識別模式(例如:“ Key1”,“ Key2”等),那么也許您可以使用已編譯的Regex替換工具一次性完成所有替換操作?
  • 輸入查詢是否固定? StringBuilder.Append()可能比100x搜索和替換速度快。
  • 如果需要迭代所有對,為什么要使用字典? 跳過哈希魔術和堆中的其他對象,並循環訪問簡單的鍵值對。 並不是說您會感覺到明顯的性能差異。

再說一遍! 使用.net探查器並測量真正的瓶頸在哪里,並確定哪種方法最適合您的特定方案。

無論您決定使用哪種非平凡的解決方案,請記住,下一個維護代碼的人可能知道您的住所。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM