日历归档 |
|
<< < 2024 - 11 > >> | Su | Mo | Tu | We | Th | Fr | Sa | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
|
|
|
About Me |
|
|
ZhangSichu |
|
Male |
|
32 |
|
ZhangSichu@gmail.com |
|
ZhangSichu@hotmail.com |
|
ZhangSichu.com |
|
weibo.com/zhangsichu |
|
|
|
个人推荐 |
|
|
|
|
分类归档 |
|
|
|
|
My Friends |
|
|
|
|
加速Dictionary取值[转载]
|
原文: http://gcdn.grapecity.com/cs/forums/thread/3709.aspx 经过编辑。 在程序中常会有这样的代码。 多了可能会影响效率。
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 只调用了一次,同时判断了有没有也得到了值。
|
|
#re:加速Dictionary<TKey, TValue>取值[转载] 12/19/2013 4:39:03 PM 淡淡的地址
|
|
#re:加速Dictionary<TKey, TValue>取值[转载] 10/29/2013 5:38:09 PM 123
|
|
|
|
|
|