测试Dictionary KeyNotFoundException

时间:2015-06-03 00:28:36

标签: c#

我有一个场景,其中有一个字典在给定时间可能有也可能没有键值。我目前正在测试以下方式查看值是否存在,但是想知道这是否是最好的方法,或者是否有更好的方法来处理它。

int myInt;

try
{
    myInt = {Value From Dictionary};
}
catch
{
    myInt = 0;
}

有什么输入?感谢。

4 个答案:

答案 0 :(得分:5)

查看词典的TryGetValue方法

\Program Files\R\R-3.2.0\etc

有几个人建议使用ContainsKey。如果你真的想要这个值,这不是一个好主意,因为它意味着2个查找 - 例如

  int myInt;
  if (!_myDictionary.TryGetValue(key, out myInt))
  {
      myInt = 0;
  }

答案 1 :(得分:1)

以下是您的示例

 using System;
 using System.Collections.Generic;

class Program
{
 static void Main()
 {
  Dictionary<string, string> test = new Dictionary<string, string>();
  test.Add("one", "value");
//
// Use TryGetValue to avoid KeyNotFoundException.
//
string value;
if (test.TryGetValue("two", out value))
{
    Console.WriteLine("Found");
}
else
{
    Console.WriteLine("Not found");
}
  }
}

答案 2 :(得分:1)

首先,在这里使用try catch并不是一个好主意,您可以通过ContainsKeyTryGetValue

轻松减慢代码的速度。

我建议使用此处提到的TryGetValue解决方案 - https://msdn.microsoft.com/en-us/library/kw5aaea4(v=vs.110).aspx(查看示例)

但你可以优化更多。 @Mark建议,行myInt = 0;是多余的。 TyGetValue会在返回时自动设置default值(0int)。

  

如果未找到密钥,则value参数将获取TValue类型的相应默认值;例如,0(零)表示整数类型,false表示布尔类型,null表示引用类型。   https://msdn.microsoft.com/en-us/library/bb347013%28v=vs.110%29.aspx

所以最终的代码可能是

int myInt;
if (_myDictionary.TryGetValue(key, out myInt))
{
    [...] //codes that uses the value
}else{
    [...] //codes that does not use the value
}

或 -

int myInt;
_myDictionary.TryGetValue(key, out myInt))
[...] //other codes.

下一段是从 TryGetValue -

文档中复制的
  

此方法结合了ContainsKey方法的功能   Item属性。如果未找到密钥,则为value参数   获取TValue类型的相应默认值;例如,0   (零)表示整数类型,false表示布尔类型,null表示   参考类型。如果您的代码经常使用TryGetValue方法   尝试访问不在字典中的键。 使用此   方法比捕获引发的KeyNotFoundException更有效   通过Item属性。此方法接近O(1)操作。

BTW ContainsKeyTryGetValue都有 O(1)的运行时间。所以,它没关系,你可以使用任何。

答案 3 :(得分:0)

如果您正在讨论通用字典,那么避免异常的最佳方法是使用ContainsKey方法在使用之前测试字典是否有密钥。