Dictionary Keys.Contains vs. ContainsKey:它们在功能上是否相同?

时间:2011-11-23 00:27:33

标签: c# performance dictionary equivalence

我很想知道这两者在所有情况下是否在功能上都是等效的。

通过更改字典的默认比较器,这两者在功能上是否有所不同?

另外,isn&#t; t Keys.Contains几乎可以保证更慢?

2 个答案:

答案 0 :(得分:21)

这两个功能完全相同。

Keys.Contains存在,因为KeysICollection<TKey>,定义了Contains方法。
标准Dictionary<TKey, TValue>.KeyCollection实现(类,而不是接口)将其定义为

bool ICollection<TKey>.Contains(TKey item){ 
    return dictionary.ContainsKey(item); 
}

由于它是明确实现的,你甚至无法直接调用它。


你要么看到我在上面解释过的接口,要么看到LINQ Contains()扩展方法,它也会调用本机实现,因为它实现了ICollection<T>

答案 1 :(得分:9)

虽然它们与Dictionary<,>非常相同,但我发现坚持ContainsKey()会更安全。

原因是将来您可能决定使用ConcurrentDictionary<,>(使您的代码成为线程安全的),并且在该实现中,ContainsKey明显更快(因为访问{{1} }属性执行一大堆锁定并创建一个新集合。)