这是我的情况:
我正在使用字典对象存储一些键,然后基于对象中存在的键,代码正在执行某些操作。
到目前为止,我一直在使用-LINQ-Any()
dictionaryObject.Any(x => x.Key.Equals("SomeParameter"))
。在我的字典对象突然获得200,000个键之前,这一直可以满足所有情况。
它开始影响性能,其余过程也是如此。
然后我意识到,有一个字典方法ContainsKey("SomeParameter")
,使用这种方法后,性能确实得到了改善。
现在,我更感兴趣地看到ContainsKey
与LINQ Any
的不同之处,因为我带下划线的代码分别使用了for
和foreach
,这意味着它遍历列表
答案 0 :(得分:7)
这是ContainsKey方法的代码
private int FindEntry(TKey key)
{
if ((object) key == null)
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
if (this.buckets != null)
{
int num = this.comparer.GetHashCode(key) & int.MaxValue;
for (int index = this.buckets[num % this.buckets.Length]; index >= 0; index = this.entries[index].next)
{
if (this.entries[index].hashCode == num && this.comparer.Equals(this.entries[index].key, key))
return index;
}
}
return -1;
}
您可能会看到,一旦有了密钥,
它是O(1)运算,而Any
是IEnumerable
的一部分,并且对元素序列执行简单的迭代,直到满足条件为止,因此O(n)-可调用性大大降低。这就是您观察到的-随着数据量的增长,Any
的性能会变差。
请参阅System.Collections.Generic,mscorlib中的Dictionary
声明
public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>,
ICollection<KeyValuePair<TKey, TValue>>,
IEnumerable<KeyValuePair<TKey, TValue>>, //this one "brings" Any
IEnumerable,
IDictionary,
ICollection,
IReadOnlyDictionary<TKey, TValue>,
IReadOnlyCollection<KeyValuePair<TKey, TValue>>,
ISerializable,
IDeserializationCallback