c# - 字典 ArgumentException 日志重复键 : which is more performant?

标签 c# dictionary try-catch big-o

这里我向字典添加了一些内容:

dictionary.Add(dictionaryKey, value);

如果 dictionaryKey 已经存在,将抛出 ArgumentException。它的信息相当通用:

An item with the same key has already been added.

如果我对 dictionary.Add 的调用是在循环或辅助函数内,则很难立即判断已经添加了哪个键引发了此异常。我想尽快轻松地知道这一点。

有几个选项。

1)

if(dictionary.ContainsKey(dictionaryKey)
{
    throw new ArgumentException($"An item with the same key ({dictionaryKey}) has already been added.");
}

dictionary.Add(dictionaryKey, value);

2)

try
{
    dictionary.Add(dictionaryKey, value);
}
catch(ArgumentException argumentException)
{
    throw new ArgumentException($"An item with the same key ({dictionaryKey}) has already been added.");
}

3) 其他方式

我知道设置 try/catch block 会影响性能,但似乎运行 dictionary.ContainsKey(dictionaryKey) 也意味着每次都要进行额外的查找。以下哪个选项的性能最高?

最佳答案

不确定此代码的上下文落入何处,但就性能而言,这将取决于您是否期望重复的 dictionaryKey

如果要重复,我会使用第一种方法,因为 ContainsKey 是一个 O(1) 操作,而 try/catch 引发 small performance penalty如果用于处理控制流。据推测,这个惩罚会大于 O(1)。

但是,如果您可以保证没有重复的 dictionaryKey,则第二种方法会更快。 try/catch 性能损失仅在抛出异常(发现重复键)时发生。第一种方法将对 ContainsKey 执行不必要的调用。当然,这意味着您不需要首先将代码包装在 try/catch 中,这违背了您提出问题的目的。

我会选择第一种方法。

关于c# - 字典 ArgumentException 日志重复键 : which is more performant?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44850359/

相关文章:

c# - 使用 WTelegramClient 获取 channel 消息历史记录并标记 View

c# - Math.Floor vs 在 C# 中转换为整数类型

c# - 为 whatsapp API 使用密码生成软件时为我的号码生成密码时出错

php - 如何使用try catch

c# - 抛出带有代码和消息的新异常

c# - Gridview RowCommand 不在服务器上触发,但在本地工作

c# - 哈希表到字典

c++ - STL 映射因 mpz_class (GMP) 值而损坏

c# - 构建列表中项目计数的字典

C# SocketException 没有被捕获