繁体   English   中英

C#字典ContainsKey与Keys.Any()

[英]C# Dictionary ContainsKey Vs Keys.Any()

这是我的情况:

我正在使用字典对象存储一些键,然后基于对象中存在的键,代码正在执行某些操作。

到现在dictionaryObject.Any(x => x.Key.Equals("SomeParameter"))我一直在使用dictionaryObject.Any(x => x.Key.Equals("SomeParameter")) - Any() dictionaryObject.Any(x => x.Key.Equals("SomeParameter")) 直到我的字典对象突然获得200,000个键之前,这都是可行的并且满足所有情况。

它开始影响性能,其余过程也是如此。

然后我意识到,有一个字典方法ContainsKey("SomeParameter") ,使用它之后,性能确实得到了改善。

现在,我更感兴趣的是查看ContainsKey与LINQ Any什么不同,因为我加下划线的代码分别forforeach ,这意味着它foreach列表。

这是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)运算,而AnyIEnumerable的一部分,并且对元素序列执行简单的迭代,直到满足条件为止,因此O(n)-可调用性大大降低。 这就是您观察到的-随着数据量的增长, Any性能会变差。

请参阅mscorlib中System.Collections.Generic的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM