在许多情况下,为简单起见,我宁愿将List或HashSet与LINQ结合使用,而不是使用Dictionary。但是,我通常坚持使用Dictionary,因为我认为Dictionary由于其哈希表实现而性能更高。
例如:
当我在LINQ中执行此操作时:
bool exists = hashset.Any(item => item.Key == someKey);
与以下与Dictionary相当的产品相比,我是否会失去明显的性能?
bool exists = dictionary.ContainsKey(someKey); // an O(1) operation
LINQ查询是否以某种方式进行了优化,以使其成为针对Dictionary的合理选择?还是上面的Any()是普通的O(n)操作,而不管它对哪种收集类型执行?
最佳答案
在您的情况下,您将消除哈希集的好处,因为在这种情况下,Any是在IEnumerable上定义的extension method。它只是简单地遍历哈希集,就好像它是一个列表,并在每个项目上调用==运算符。实际上,这两个代码示例甚至不是严格等效的-LINQ语句使用==运算符,而字典使用哈希码/等于等式。这些对于值类型和字符串是等效的,但并非对于所有类都是等效的。
您可以执行以下操作:
bool exists = hashset.Contains(item.Key);
这将使用Hashset的优化查找,而不需要像使用Dictionary那样保留虚拟值。