我试图用字典值替换字符串中的文本,如果它与字典键匹配。 从Table1中选择*,其中column1 = {Value1},Column2 = {value2}。
foreach(string key in mydict.keys)
{
if(Query.Contains(key)
{
//Replace the string
}
我可以通过字典键迭代并替换字符串中的文本,但是如果Dictionary对象中有超过100个项目,这将影响性能。
{{1}}
有没有办法实现这一点,对性能影响最小?
答案 0 :(得分:1)
只是速度和字典性能的一个例子。这是一个4岁的i7-3820的一个帖子
这意味着要经过约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(..)
)。StringBuilder.Append()
可能比100x搜索和替换更快。再次 - 测量!使用.net分析器并测量真正瓶颈所在的位置,并确定哪种方法最适合您的特定场景。
无论您决定使用哪种非平凡的解决方案,请记住,下一个维护代码的人可能知道您居住的地方。