我尝试检查null但编译器警告这种情况永远不会发生。我应该寻找什么?
答案 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正是您要找的。 p>
答案 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;
}
}
然后,您可以管理此词典的行为。
例如此处:如果字典中没有键,它将返回您通过参数传递的键。