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

use*_*667 20 c# performance dictionary equivalence

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

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

而且,Keys.Contains几乎不能保证更慢?

SLa*_*aks 22

这两个函数完全相同.

Keys.Contains因为Keys是a ICollection<TKey>,它定义了一个Contains方法.
标准Dictionary<TKey, TValue>.KeyCollection实现(类,而不是接口)将其定义为

bool ICollection<TKey>.Contains(TKey item){ 
    return dictionary.ContainsKey(item); 
}
Run Code Online (Sandbox Code Playgroud)

由于它是明确实现的,因此您甚至无法直接调用它.


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


Rob*_*los 10

虽然它们几乎相同Dictionary<,>,但我觉得坚持下去要安全得多ContainsKey().

原因在于,将来您可能决定使用ConcurrentDictionary<,>(使代码线程安全),并且在该实现中,ContainsKey速度明显更快(因为访问Keys属性会执行大量锁定并创建新集合).