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

del*_*ber 111 c# dictionary

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

Jon*_*eet 179

假设你想,如果键获得值存在,请使用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
}
Run Code Online (Sandbox Code Playgroud)

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

请注意,即使你使用引用类型,检查空行不通-索引的Dictionary<,>,如果你请求缺少键将抛出一个异常,而不是返回null.(这Dictionary<,>和之间有很大的不同Hashtable.)

  • @nawfal:我认为没有任何迹象表明这个问题根本没有说明.它说它比'ContainsKey`做更多的工作,这是真的,因为它也必须提取价值.但它没有进行两次查找. (4认同)

ant*_*tik 23

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

如建议的那样,ContainsKey是适当的预防措施. TryGetValue也很有效.

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


Chr*_*isF 10

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

if (!openWith.ContainsKey("ht"))
{
    openWith.Add("ht", "hypertrm.exe");
}
Run Code Online (Sandbox Code Playgroud)

如果您正在检查该值是否存在,请使用TryGetValueJon Skeet的答案中描述的方法.

  • TryGet更好 (7认同)
  • 如果您立即获取包含,则可以通过哈希表两次解析密钥查找.Wintellect PowerCollections还有`GetValueElseAdd`方法,你可以给出一个值(或者一个`Func <TValue>`)来保存插入的分辨率,如果你要添加它,如果不存在的话.我想没有进入.NET库的原因是因为如果你在缓存样式中使用它,则添加路径的频率较低] (2认同)