C#如果文本包含在String列表中,则替换字符串中的文本

时间:2016-05-12 20:49:19

标签: c# str-replace

我试图用字典值替换字符串中的文本,如果它与字典键匹配。 从Table1中选择*,其中column1 = {Value1},Column2 = {value2}。

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

我可以通过字典键迭代并替换字符串中的文本,但是如果Dictionary对象中有超过100个项目,这将影响性能。

{{1}}

有没有办法实现这一点,对性能影响最小?

2 个答案:

答案 0 :(得分:1)

只是速度和字典性能的一个例子。这是一个4岁的i7-3820的一个帖子

  • 在字符串中找到1"在11998948输入"及时0ms
  • 在字符串中找到4"在11998948输入"及时0ms
  • 在字符串中找到8"在11998948输入"及时1ms
  • 在字符串中找到9"在11998948输入"及时1ms
  • 在字符串&#34中找到11;在11998948输入"及时1ms
  • 在字符串中找到19"在11998948输入"及时1ms
  • 在字符串中找到48"在11998948输入"及时1ms
  • 在字符串中找到89"在11998948输入"及时1ms
  • 在字符串中找到94"在11998948输入"及时1ms
  • 在字符串中找到98"在11998948输入"及时1ms
  • 在字符串中找到99"在11998948输入"及时1ms
  • 在字符串中找到119"在11998948输入"及时1ms
  • 在字符串中找到199"在11998948输入"及时1ms
  • 在字符串中找到894"在11998948输入"及时1ms
  • 在字符串中找到948"在11998948输入"在时间2ms
  • 在字符串中找到989"在11998948输入"在时间2ms
  • 在字符串中找到998"在11998948输入"在时间2ms
  • 在字符串中找到1199"在11998948输入"在时间2ms
  • 1998年发现字符串"一些11998948输入"在时间2ms
  • 在字符串中找到8948"在11998948输入"及时3毫秒
  • 在字符串中找到9894"在11998948输入"及时3毫秒
  • 在字符串中找到9989"在11998948输入"及时3毫秒
  • 在字符串&#34中找到11998;在11998948输入"及时4毫秒
  • 在字符串&#34中找到19989;在11998948输入"在时间5ms
  • 在字符串中找到98948"在11998948输入"及时21毫秒
  • 在字符串中找到99894"在11998948输入"及时21毫秒
  • 在字符串中找到119989"在11998948输入"在时间25ms
  • 在字符串中找到199894"在11998948输入"及时42毫秒
  • 在字符串中找到998948"在11998948输入"及时214毫秒
  • 在字符串中找到1199894"在11998948输入"在时间255毫秒
  • 在字符串中找到1998948"在11998948输入"及时400毫秒
  • 在字符串中找到11998948"在11998948输入"在时间2127ms

这意味着要经过约1,200万个元素需要大约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();

答案 1 :(得分:1)

首先警告:在你知道自己确实遇到性能问题之前,不要为了优化而复杂化。 100次替换对我来说听起来不是什么大不了的事。通常,代码可读性和花时间解决实际问题比保存10ns的代码更有价值。

假设每纳秒确实非常重要,那么您应该测量基线并考虑改进方案:

  • 从内置的简单工具开始,例如String.Replace()。它们在内部通常比你自己做的更优化(除非你知道对输入或所需行为的一些重要的额外限制)。
  • 在更换之前不要做额外的Contains(key)因为您需要搜索确切的位置以进行替换。或者,如果您选择处理索引,则重用第一遍,如使用String.IndexOf(..))。
  • 如果您的密钥具有类似的可识别模式(例如:&#34; Key1&#34;,&#34; Key2&#34;等),那么您可以使用编译的{{3在一次传递中完成所有替换替换工具?
  • 输入查询是否可以修复? StringBuilder.Append()可能比100x搜索和替换更快。
  • 如果你需要迭代所有对,为什么要使用字典?在堆中跳过hash-magic adn额外对象并在简单键值对上循环。并不是说你会感觉到性能上的显着差异..

再次 - 测量!使用.net分析器并测量真正瓶颈所在的位置,并确定哪种方法最适合您的特定场景。

无论您决定使用哪种非平凡的解决方案,请记住,下一个维护代码的人可能知道您居住的地方。