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属性会执行大量锁定并创建新集合).