这里我向字典
添加了一些内容:
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/