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