测试字典KeyNotFoundException

本文关键字:KeyNotFoundException 字典 测试 | 更新日期: 2023-09-27 17:52:57

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

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

输入吗?谢谢。

测试字典KeyNotFoundException

看一下字典的TryGetValue方法

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

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

if (_myDictionary.ContainsKey(key)) // look up 1
{
 myInt = _myDictionary[key]; // look up 2
}

给你一个例子

 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");
}
  }
}

首先,在这里使用try catch不是一个好主意,您不必要地减慢了代码速度,而您可以轻松地使用ContainsKeyTryGetValue

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

但是你可以优化更多。正如@Mark所建议的,myInt = 0;行是多余的。当TyGetValue返回时,它会自动将default的值(int的值为0)。

如果没有找到键,则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整数类型为(0),布尔类型为false,为引用类型。如果您的代码经常使用TryGetValue方法尝试访问字典中没有的键。使用这个方法比捕获抛出的KeyNotFoundException更有效通过Item属性。这个方法接近一个0(1)的操作。

BTWContainsKeyTryGetValue的运行时间 0 (1)。所以,没关系,你可以使用任意的

如果您谈论的是泛型字典,那么避免异常的最佳方法是在使用字典之前使用ContainsKey方法来测试字典是否有键。

相关文章:
  • 没有找到相关文章