LINQ性能与字典<k,v> </k,v>

时间:2011-10-19 02:31:47

标签: c# performance linq data-structures

在许多情况下,为了简单起见,我宁愿将List或HashSet与LINQ结合使用而不是使用Dictionary。但是,我通常坚持使用Dictionary,因为我认为Dictionary因其哈希表实现而具有更高的性能。

例如:

当我在LINQ中执行此操作时:

bool exists = hashset.Any(item => item.Key == someKey);

与下面的词典相比,我是否会失去显着的表现?

bool exists = dictionary.ContainsKey(someKey); // an O(1) operation

LINQ查询是否以某种方式进行了优化,使它们成为对词典的合理选择?或者上面的Any()是一个普通的O(n)操作,无论它执行哪种类型的集合?

1 个答案:

答案 0 :(得分:9)

在你的情况下,你正在消除hashset的好处,因为在这种情况下Any是在IEnumerable上定义的extension method。它只是在hashset上迭代,就好像它是一个List并在每个项目上调用==运算符。实际上,这两个代码示例甚至不是严格等效的 - LINQ语句使用==运算符,字典使用hashcode / equals相等。这些对于值类型和字符串是等效的,但不适用于所有类。

你可以做的是:

bool exists = hashset.Contains(item.Key);

这将使用Hashset的优化查找,而不需要像使用Dictionary一样保留虚拟值。