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