我有一个场景,其中有一个字典在给定时间可能有也可能没有键值。我目前正在测试以下方式查看值是否存在,但是想知道这是否是最好的方法,或者是否有更好的方法来处理它。
int myInt;
try
{
myInt = {Value From Dictionary};
}
catch
{
myInt = 0;
}
有什么输入?感谢。
答案 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
并不是一个好主意,您可以通过ContainsKey
或TryGetValue
我建议使用此处提到的TryGetValue
解决方案 - https://msdn.microsoft.com/en-us/library/kw5aaea4(v=vs.110).aspx(查看示例)
但你可以优化更多。 @Mark建议,行myInt = 0;
是多余的。 TyGetValue
会在返回时自动设置default
值(0
为int
)。
如果未找到密钥,则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 ,ContainsKey
和TryGetValue
都有 O(1)的运行时间。所以,它没关系,你可以使用任何。
答案 3 :(得分:0)
如果您正在讨论通用字典,那么避免异常的最佳方法是使用ContainsKey方法在使用之前测试字典是否有密钥。