C#中Dictionary的TryGetValue和Contains

Posted Hello Bug.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中Dictionary的TryGetValue和Contains相关的知识,希望对你有一定的参考价值。

一:前言

如果只是判断字典中某个值是否存在,使用Contains和TryGetValue都可以。如果需要判断是否存在之后再得到某个值,尽量使用TryGetValue

if (Dictionary.TryGetValue(key, out value))




if(Dictionary.ContainsKey(key))

	var value = Dictionary[key];

二:解释

先看一下TryGetValue源码实现

public bool TryGetValue(TKey key, out TValue value)
        
            if (key == null)
            
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
            
            lock(_lock)
            
                VerifyIntegrity();
                return TryGetValueWorker(key, out value);
            
        

        private bool TryGetValueWorker(TKey key, out TValue value)
        
            int entryIndex = FindEntry(key);
            if (entryIndex != -1)
            
                Object primary = null;
                Object secondary = null;
                _entries[entryIndex].depHnd.GetPrimaryAndSecondary(out primary, out secondary);
                // Now that we've secured a strong reference to the secondary, must check the primary again
                // to ensure it didn't expire (otherwise, we open a ---- where TryGetValue misreports an
                // expired key as a live key with a null value.)
                if (primary != null)
                
                    value = (TValue)secondary;
                    return true;
                
            
 
            value = default(TValue);
            return false;
        

再看一下ContainsKey和字典索引的实现

public bool ContainsKey(TKey key) 
            return FindEntry(key) >= 0;
        

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

想得到某个值,用TryGetValue只调用了1次FindEnty,而ContainKey判断还需要使用字典索引,一共需要调用2次FindEnty才能获取到值

以上是关于C#中Dictionary的TryGetValue和Contains的主要内容,如果未能解决你的问题,请参考以下文章

C# Dictionary 是不是有可能返回一个完全错误的值。

字典中 TryGetValue 的 Resharper 重构模式

C# 函数关键字

c#中泛型类型的默认值[重复]

C#中Dictionary的用法 [转载]

字典TryGetValue