如果密钥不存在,C#Dictionary <int,int =“”>查找会发生什么?</int,>

时间:2010-01-26 11:17:34

标签: c# dictionary

我尝试检查null但编译器警告这种情况永远不会发生。我应该寻找什么?

9 个答案:

答案 0 :(得分:170)

假设您想要在 键存在的情况下获取值,请使用Dictionary<TKey, TValue>.TryGetValue

int value;
if (dictionary.TryGetValue(key, out value))
{
    // Key was in dictionary; "value" contains corresponding value
} 
else 
{
    // Key wasn't in dictionary; "value" is now 0
}

(使用ContainsKey,然后索引器使它看起来两次键,这是毫无意义的。)

请注意,即使 使用引用类型,检查null也行不通 - 如果请求丢失键,Dictionary<,>的索引器将抛出异常,而不是返回空值。 (Dictionary<,>Hashtable之间存在很大差异。)

答案 1 :(得分:22)

如果字典不包含您的密钥,则字典会抛出KeyNotFound异常。

根据建议,ContainsKey是适当的预防措施。 TryGetValue也很有效。

这允许字典更有效地存储null值。如果没有它以这种方式运行,从[]运算符检查空结果将指示空值或输入键的不存在,这是不好的。

答案 2 :(得分:10)

如果您在尝试添加新值之前只是检查,请使用ContainsKey方法:

if (!openWith.ContainsKey("ht"))
{
    openWith.Add("ht", "hypertrm.exe");
}

如果您检查该值是否存在,请使用Jon Skeet的答案中所述的TryGetValue方法。

答案 3 :(得分:2)

在尝试提取值之前,您应该检查Dictionary.ContainsKey(int key)。

Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);

int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
    myValueLookup = myDictionay[keyToFind];
    // do work...
}
else
{
    // the key doesn't exist.
}

答案 4 :(得分:1)

int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;

如果该键存在于字典中,则它返回键的值,否则返回0。

希望,这段代码对您有所帮助。

答案 5 :(得分:0)

ContainsKey正是您要找的。

答案 6 :(得分:0)

您应该使用:

if(myDictionary.ContainsKey(someInt))
{
  // do something
}

您无法检查null的原因是此处的键是值类型。

答案 7 :(得分:0)

帮助程序类很方便:

public static class DictionaryHelper
{
    public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
    {
        TVal val;
        if( dictionary.TryGetValue(key, out val) )
        {
            return val;
        }
        return defaultVal;
    }
}

答案 8 :(得分:0)

考虑封装此特定字典的选项,并提供一种方法来返回该键的值:

public static class NumbersAdapter
{
    private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
    {
        ["1"] = "One",
        ["2"] = "Two",
        ["3"] = "Three"
    };

    public static string GetValue(string key)
    {
        return Mapping.ContainsKey(key) ? Mapping[key] : key;
    }
}

然后,您可以管理此词典的行为。

例如此处:如果字典中没有键,它将返回您通过参数传递的键。