Dictionary.Keys.Contains(key)和Dictionary.ContainsKey(key)之间有什么区别吗

时间:2017-09-03 22:30:14

标签: c# .net

假设:

Dictionary<Guid, MyClass> dict;

有任何差异between

dict.Keys.Contains(key)

and

dict.ContainsKey(key)

我认为没有区别,但我现在不确定。

3 个答案:

答案 0 :(得分:8)

这两种方法保证返回相同的true / false值。

根据reference implementationdict.Keys.Contains(key)代表dict.ContainsKey(key)

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

此方法是KeyCollection类的一部分。其dictionary字段指的是拥有Dictionary属性返回的KeyCollection的{​​{1}}对象。

答案 1 :(得分:2)

第一行在搜索键之前检索键集合,而第二行直接搜索字典的键,避免了额外的步骤。

根据Dictionary.Keys属性的文档,访问集合是一个常量时间操作,不涉及创建整个字典键集的副本。因此,除了在搜索密钥之前检索密钥集合的附加步骤之外,这两个操作之间似乎没有什么区别。

在所有条件相同的情况下,我个人更喜欢第二个版本,因为它会跳过额外的步骤并更简洁地传达您的意图。

答案 2 :(得分:1)

字典已针对查找键进行了优化。

使用dict.ContainsKey(key),您一定会使用优化搜索。

使用dict.Keys.Contains(key)时,您更依赖于实施。天真的路线首先得到IEnumerable<TKey>,然后进行(线性)查找。实际的库类可能更聪明,但您总是必须查找源代码以确定。

相关问题