假设:
Dictionary<Guid, MyClass> dict;
有任何差异between
dict.Keys.Contains(key)
dict.ContainsKey(key)
我认为没有区别,但我现在不确定。
答案 0 :(得分:8)
这两种方法保证返回相同的true
/ false
值。
根据reference implementation,dict.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>
,然后进行(线性)查找。实际的库类可能更聪明,但您总是必须查找源代码以确定。