我很想知道这两者在所有情况下是否在功能上都是等效的。
是否有可能通过更改字典的默认比较器使这两者在功能上有所不同?
另外,Keys.Contains
几乎不能保证会变慢吗?
我很想知道这两者在所有情况下是否在功能上都是等效的。
是否有可能通过更改字典的默认比较器使这两者在功能上有所不同?
另外,Keys.Contains
几乎不能保证会变慢吗?
这两个函数做的事情完全相同。
Keys.Contains
存在是因为Keys
是一个ICollection<TKey>
,它定义了一个Contains
方法。
标准Dictionary<TKey, TValue>.KeyCollection
实现(类,而不是接口)将其定义为
bool ICollection<TKey>.Contains(TKey item){
return dictionary.ContainsKey(item);
}
由于它是显式实现的,因此您甚至不能直接调用它。
您要么看到我上面解释的接口,要么看到 LINQContains()
扩展方法,它也将调用本机实现,因为它实现了ICollection<T>
.
虽然它们几乎等同于Dictionary<,>
,但我发现坚持使用更安全ContainsKey()
。
原因是将来您可能会决定使用ConcurrentDictionary<,>
(使您的代码线程安全),并且在该实现中,ContainsKey
速度明显更快(因为访问该Keys
属性会执行一大堆锁定并创建一个新集合)。