Dictionary加速查询(TryGetValue)(转)

在程序中常会有这样的代码。
多了可能会影响效率。

Dictionary<Key, Value> dict = new Dictionary<Key, Value>();
...........

if (dict.ContainsKey(key))
{
Value value = dict[key];
}

 

看来没有什么问题。
但是在实际项目中,这种代码一般会写在底层的class中。
它被调用的次数 相当大时,需要优化。

MS.Net2.0如何实现:

public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback
{
    public bool ContainsKey(TKey key)
    {
        return (this.FindEntry(key) >= 0);
    }

    public TValue this[TKey key]
    {
        get
        {
             int index = this.FindEntry(key);
             if (index >= 0)
             {
                  return this.entries[index].value;
             }
             ThrowHelper.ThrowKeyNotFoundException();
             return default(TValue);
         }
         set
        {
             this.Insert(key, value, false);
         }
    }
}                                     

 

 


FindEntry()被调用了2次!这就导致速度变慢了1倍!

解决方案:估计微软自己也发现 了,所以在2.0里面封装了一个新的method:

public bool TryGetValue(TKey key, out TValue value)
{
         int index = this.FindEntry(key);
         if (index >= 0)
         {
                value = this.entries[index].value;
                return true;
          }
          value = default(TValue);
          return false;
}

 


于是,上面的代码就可以改写成:

Dictionary<Key, Value> dict = new Dictionary<Key, Value>();
...........
Value value;
if (dict.TryGetValue(key, out value))
{
      value.......
}

 


使 用TryGetValue,FindEntry 只调用了一次,同时判断了有没有也得到了值。
在程序中常会有这样的代码

MSDN:

Namespace: System.Collections.Generic
Assembly: mscorlib (in mscorlib.dll)

public bool TryGetValue (
    TKey key,
    out TValue value
)

 

posted @ 2013-12-05 13:21  邹邹  Views(859)  Comments(0)    收藏  举报