处理 KeyNotFoundException 的最佳方法

发布于 2024-07-14 01:36:36 字数 317 浏览 10 评论 0原文

我正在使用字典来查找我正在开发的程序。 我在字典中运行了一堆键,并且我希望某些键没有值。 我捕捉到 KeyNotFoundException 就在它发生的地方,并吸收它。 所有其他异常都会传播到顶部。 这是处理这个问题的最佳方法吗? 或者我应该使用不同的查找? 该字典使用 int 作为其键,并使用自定义类作为其值。

I am using a dictionary to perform lookups for a program I am working on. I run a bunch of keys through the dictionary, and I expect some keys to not have a value. I catch the KeyNotFoundException right where it occurs, and absorb it. All other exceptions will propagate to the top. Is this the best way to handle this? Or should I use a different lookup? The dictionary uses an int as its key, and a custom class as its value.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

念﹏祤嫣 2024-07-21 01:36:36

使用 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);
}

Use Dictionary.TryGetValue instead:

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);
}
倾听心声的旋律 2024-07-21 01:36:36

尝试使用:
Dict.ContainsKey

编辑:
性能方面,我认为 Dictionary.TryGetValue 比其他人建议的更好,但我不喜欢在不需要时使用 Out,所以在我看来 ContainsKey 更具可读性,但需要更多代码行如果您也需要该值。

Try using:
Dict.ContainsKey

Edit:
Performance wise i think Dictionary.TryGetValue is better as some other suggested but i don't like to use Out when i don't have to so in my opinion ContainsKey is more readable but requires more lines of code if you need the value also.

勿忘初心 2024-07-21 01:36:36

使用 TryGetValue 的一行解决方案

string value = dictionary.TryGetValue(key, out value) ? value : "No key!";

请注意,value 变量必须是字典在本例中返回的类型 string。 这里不能使用 var 来声明变量。

如果您使用的是 C# 7,在这种情况下,您可以包含 var 并内联定义它:

string value = dictionary.TryGetValue(key, out var tmp) ? tmp : "No key!";

这也是一个很好的扩展方法,它将完全实现您想要实现的功能 dict.GetOrDefault("Key")或 dict.GetOrDefault("键", "无值")

public static TValue GetOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue = default(TValue))
{
      if (dictionary != null && dictionary.ContainsKey(key))
      {
           return dictionary[key];
      }
      return defaultValue;
 }

One line solution using TryGetValue

string value = dictionary.TryGetValue(key, out value) ? value : "No key!";

Be aware that value variable must be of type which dictionary returns in this case string. Here you can not use var for variable declaration.

If you are using C# 7, in which case you CAN include the var and define it inline:

string value = dictionary.TryGetValue(key, out var tmp) ? tmp : "No key!";

Here is also nice extension method which will do exactly what you want to achieve dict.GetOrDefault("Key") or dict.GetOrDefault("Key", "No value")

public static TValue GetOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue = default(TValue))
{
      if (dictionary != null && dictionary.ContainsKey(key))
      {
           return dictionary[key];
      }
      return defaultValue;
 }
逆光下的微笑 2024-07-21 01:36:36

这是一个单行解决方案(请记住,这会进行两次查找。请参阅下面的 tryGetValue 版本,该版本应该在长时间运行的循环中使用。)

string value = dictionary.ContainsKey(key) ? dictionary[key] : "default";

但是我发现自己每次访问字典时都必须执行此操作。 我希望它返回 null,这样我就可以写:

string value = dictionary[key] ?? "default";//this doesn't work

Here is a one line solution (Keep in mind this makes the lookup twice. See below for the tryGetValue version of this which should be used in long-running loops.)

string value = dictionary.ContainsKey(key) ? dictionary[key] : "default";

Yet I find myself having to do this everytime I access a dictionary. I would prefer it return null so I can just write:

string value = dictionary[key] ?? "default";//this doesn't work
长亭外,古道边 2024-07-21 01:36:36

我知道这是一个旧线程,但如果它有帮助,之前的答案很棒,但是可以解决复杂性的评论和乱扔代码的担忧(对我来说也都有效)。

我使用自定义扩展方法以更优雅的形式包装上述答案的复杂性,以便它不会散布在整个代码中,然后它可以为空合并运算符提供强大的支持。 。 。 同时还最大化性能(通过上面的答案)。

namespace System.Collections.Generic.CustomExtensions
{
    public static class DictionaryCustomExtensions
    {
        public static TValue GetValueSafely<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
        {
            TValue value = default(TValue);
            dictionary.TryGetValue(key, out value);
            return value;
        }
    }
}

然后您只需导入命名空间 System.Collections.Generic.CustomExtensions 即可使用它

string value = dictionary.GetValueSafely(key) ?? "default";

I know this is an old thread but in case it's helpful the prior answers are great, but the comments of complexity and concerns of littering the code (all valid for me also) can be addressed.

I use a custom extension method to wrap up the complexity of the above answers in a more elegant form so that it's not littered throughout the code, and it then enables great support for null coalesce operator . . . while also maximizing performance (via above answers).

namespace System.Collections.Generic.CustomExtensions
{
    public static class DictionaryCustomExtensions
    {
        public static TValue GetValueSafely<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
        {
            TValue value = default(TValue);
            dictionary.TryGetValue(key, out value);
            return value;
        }
    }
}

Then you can use it simply by importing the namespace System.Collections.Generic.CustomExtensions

string value = dictionary.GetValueSafely(key) ?? "default";
那请放手 2024-07-21 01:36:36

您应该使用字典的“ContainsKey(string key)”方法来检查键是否存在。
对正常程序流程使用异常不被认为是一个好的做法。

you should use the 'ContainsKey(string key)' method of the Dictionary to check if a key exists.
using exceptions for normal program flow is not considered a good practice.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文