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

你可能感兴趣的:(value)