• LINQ 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 只调用了一次,同时判断了有没有也得到了值。 
    在程序中常会有这样的代码。
    多了可能会影响效率。

    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 只调用了一次,同时判断了有没有也得到了值。

  • 相关阅读:
    我与酷派手机N900+的艰难之旅
    从ASPNET1.1迁移到了ASPNET2.0遇到ORA01000: 超出打开游标的最大数
    彩铃平台接口独立取得阶段性胜利
    中央音乐平台的MD5算法问题
    彩铃接口独立完毕
    'OraOLEDB.Oracle.1' provider is not registered on the local machine.错误的解决
    程序员的陷阱
    ASP NET页面下载程序
    从aspnet1.1升级到aspnet2.0的小问题
    彩铃平台接口的计费服务问题解决
  • 原文地址:https://www.cnblogs.com/chengulv/p/3085733.html
Copyright © 2020-2023  润新知