测试字典KeyNotFoundException
本文关键字:KeyNotFoundException 字典 测试 | 更新日期: 2023-09-27 17:52:57
我有一个场景,其中有一个字典,在给定时间可能有键值,也可能没有键值。我目前正在测试,看看是否存在以下方式的值,但想知道这是否是最好的方法,或者是否有一个更好的方法来处理这个
int myInt;
try
{
myInt = {Value From Dictionary};
}
catch
{
myInt = 0;
}
输入吗?谢谢。
看一下字典的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
不是一个好主意,您不必要地减慢了代码速度,而您可以轻松地使用ContainsKey
或TryGetValue
我建议使用这里提到的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)的操作。
BTW, ContainsKey
和TryGetValue
的运行时间 0 (1)。所以,没关系,你可以使用任意的
如果您谈论的是泛型字典,那么避免异常的最佳方法是在使用字典之前使用ContainsKey方法来测试字典是否有键。