处理KeyNotFoundException的最佳方法
我正在使用字典为我正在处理的程序执行查找。 我通过字典运行了一堆密钥,我期望有一些密钥没有价值。 我发现它发生的KeyNotFoundException
,并吸收它。 所有其他exception将传播到顶部。 这是处理这个问题的最好方法吗? 或者我应该使用不同的查找? 该字典使用int作为其键,并使用自定义类作为其值。
改用Dictionary.TryGetValue
:
Dictionary<int,string> dictionary = new Dictionary<int,string>(); int key = 0; dictionary[key] = "Yes"; string value; if (dictionary.TryGetValue(key, out value)) { Console.WriteLine("Fetched value: {0}", value); } else { Console.WriteLine("No such key: {0}", key); }
尝试使用:Dict.ContainsKey
编辑:
性能明智,我认为Dictionary.TryGetValue
是更好的一些其他人的build议,但我不喜欢用,当我不必这样在我看来,ContainsKey更具可读性,但需要更多的代码行,如果你需要的价值也。
一个使用TryGetValue
行解决scheme
string value = dictionary.TryGetValue(key, out value) ? value : "No key!";
请注意, 值variables必须是字典在此情况下返回的stringtypes 。 这里你不能使用var来表示variables声明。
下面是一个优雅的,单行的解决scheme(请记住,这使查找两次。请参阅下面的tryGetValue版本,这应该在长时间运行的循环中使用。
string value = dictionary.ContainsKey(key) ? dictionary[key] : "default";
但是我发现自己每次访问字典时都必须这样做。 我宁愿它返回null,所以我可以写:
string value = dictionary[key] ?? "default";//this doesn't work
你应该使用Dictionary的'ContainsKey(string key)'方法来检查一个键是否存在。 使用正常程序stream程的例外不被认为是一个好的做法。
- 如何在C#中序列化一个exception对象?
- JavaScript中`throw`之后需要返回吗?
- 为什么不等待Task.WhenAll抛出一个AggregateException?
- 无法加载文件或程序集…试图加载格式不正确的程序(System.BadImageFormatException)
- (未知源)在exception堆栈跟踪
- 新(std :: nothrow)与try / catch块中的New
- 设置.NETexception对象的InnerException
- 如何find在C ++中抛出exception?
- 初始化VCProjectEngineObject(Microsoft.VisualStudio.VCProjectEngine.dll)时出现错误80040154(类未注册的exception)