22

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

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

另外,Keys.Contains几乎不能保证会变慢吗?

4

2 回答 2

24

这两个函数做的事情完全相同。

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

bool ICollection<TKey>.Contains(TKey item){ 
    return dictionary.ContainsKey(item); 
}

由于它是显式实现的,因此您甚至不能直接调用它。


您要么看到我上面解释的接口,要么看到 LINQContains()扩展方法,它也将调用本机实现,因为它实现了ICollection<T>.

于 2011-11-23T00:30:52.010 回答
11

虽然它们几乎等同于Dictionary<,>,但我发现坚持使用更安全ContainsKey()

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

于 2014-06-24T18:32:56.460 回答