我有一个包含500,000个密钥的字典,我必须使用Key.contains(“Description”)进行比较。这让我的表现变得非常缓慢。有没有其他替代方法来执行更快的搜索?
我之前有过List,但表现更差。尝试使用列表上的索引,但没有太多提高性能。
答案 0 :(得分:3)
除了将所有可能的键的所有可能子串存储为字典中的键(你几乎肯定没有足够的内存可做)之外,除了遍历整个集合并进行操作之外,真的没什么可做的。检查每个项目。鉴于您正在迭代整个集合,使用Dictionary
而不是List
并没有太大的好处,至少对于这个特定的操作(可能您对此数据执行的其他操作从中获益)在Dictionary
)。它们都会很慢。你只是想要执行一项固有的昂贵操作。
如果您可以以某种方式改变您的要求以搜索完全等于您的搜索字符串的字符串,那么您可以使用字典的基于散列的查找,这非常快,如果您可以使用StartsWith
或{{ 1}}操作而不是完整EndsWith
然后您可以对数据进行排序并使用二进制搜索,但是使用Contains
操作时,不能进行任何优化。
答案 1 :(得分:1)
如果多次执行搜索,您可能需要考虑使用仅包含与预定义条件匹配的项目的额外集合。
这些集合将在填充原始字典的同时填充。
如果你的固定搜索数量有限,这可能是一个可行的解决方案。
答案 2 :(得分:0)
我已经看过通过使用Regex你会得到额外的开销,但为什么不自己对它进行基准测试呢?
这样的事情:
var test = "Telle Carraige Sawmill Rh-ccxxH440xxx38.5Hyv-Op-rL-2008";
var matchCollection = Regex.Matches(test, "(Carraige|Sawmill)",RegexOptions.IgnoreCase);
//matchCollection.Count should be == 2