即使已检查为null,Dictionary仍会抛出异常

4
我正在尝试从以下字典中读取键的值:

if (myDic["myKey"] != null)
{
}

我可以看到我正在检查 null,但是即使这样它仍然会抛出 KeyNotFoundException。我应该如何检查?请给予建议!

8个回答

10

看起来你把 HashTable 的行为和 Dictionary<TKey, TValue> 搞混了。当键不存在时,HashTable 类将返回一个 null 值,而 Dictionary<TKey, TValue> 则会引发异常。

你需要使用 ContainsKeyTryGetValue 来避免这个问题。

object value;
if (myDic.TryGetValue("apple", out value)) {
  ...
}

我必须对“优雅”持不同意见...我认为这是一个品味问题。就我个人而言,我讨厌out引用。 - Roly
@Roly,我也不喜欢使用out引用。这就是为什么我在我的C#项目中使用以下扩展方法的原因。http://blogs.msdn.com/b/jaredpar/archive/2010/03/23/dictionary-tkey-tvalue-trygetvalue-and-anonymous-types.aspx - JaredPar

6

使用

if(mydic.ContainsKey("myKey"))

4

这个异常是因为您尝试检索该项的值(检查该值是否为空),但无法检索该值,因为该键不存在。

解决方法:

if (myDic.ContainsKey("myKey")) {
}

或者:

if (myDic.TryGetValue("myKey", out value)) {
}

1
使用:
if (myDic.ContainsKey("myKey"))  
{
}

1

您正在检查与键“apple”关联的值是否不为null,而不是字典是否包含键“apple”。要实现这一点,您需要使用:

if( myDic.ContainsKey("apple") )
{

}


0

在这里,你应该使用Contains或TryGetValue。

if (myDic.ContainsKey)
{
  // get value out of dictionary
  var myValue = myDic["myKey"];
}

或者

string myValue;
if (myDic.TryGetValue("myKey", out myValue)
{
   // do something with myValue
}

[上面的例子假设您的字典具有字符串类型的值,但它可以是任何类型]

第二种方法的优点是您可以在单个原子操作中检查项目是否存在于字典中并获取其值,而不是首先进行Contains检查,然后再进行第二次调用以获取该值。


0

这可能是最简洁的做法:

SomeType myVal;
if(myDic.TryGetValue("myKey",out myVal))
{
    //good to go
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接