字典参数异常日志重复键:哪个更高效?

4

在这里,我向一个字典中添加了一些内容:

dictionary.Add(dictionaryKey, value);

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

已添加具有相同键的项。

如果我的对 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块会带来性能损失,但似乎每次运行dictionary.ContainsKey(dictionaryKey)也意味着额外的查找。哪种选项的性能最佳?


1
我会选择第一种方式,因为字典只包含O(1)的复杂度。在这种情况下不应使用异常处理。 - Akash KC
2
Try/catch块不会对性能造成任何影响,而是抛出异常会导致性能下降。 - Camilo Terevinto
错误信息中不应该已经有一个指示正在插入什么的提示吗? - jth41
2个回答

2

不确定这段代码的上下文,但就性能而言,它取决于你是否希望有重复的dictionaryKey

如果会有重复的话,我会选择第一种方法,因为ContainsKey是一个O(1)的操作,而try/catch在处理控制流时会产生轻微的性能损失。可以预见,这种惩罚将比O(1)更大。

然而,如果你可以保证没有重复的dictionaryKey,第二种方法会更快。只有在抛出异常(找到重复键)时才会发生try/catch的性能惩罚。第一种方法将执行不必要的ContainsKey调用。当然,这意味着你不需要在第一次调用中包装代码以使用try/catch,这也破坏了你提出问题的目的。

我会选择第一种方法。


0
我认为第一种方法更好。因为当你使用第二种方法时,它会触发运行时错误,这意味着它将在内存中创建一个额外的异常对象,由catch语句中的变量“argumentException”引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接