当插入可能存在密钥冲突的通用字典时,是否有理由支持其中一种方法而不是另一种方法?我正在构建静态集合的内存版本,因此在发生冲突的情况下,使用旧值或新值无关紧要。
If Not mySettings.ContainsKey(key) Then
mySettings.Add(key, Value)
End If
对战
mySettings(key) = Value
然后当然有这个,这显然不是正确的方法:
Try
mySettings.Add(key, Value)
Catch
End Try
显然,这里的最大区别是第一种和第二种方法实际上做了不同的事情,但在我的情况下并不重要。似乎第二种方法更清晰,但我很好奇你是否有任何一位.net大师有更深入的见解。谢谢!
答案 0 :(得分:3)
假设你说替换与否并不重要,我们希望真的挑剔:
选项1优势:
选项2的优点:
除非需要更严格的代码,否则我会投票选项1.我猜。要么没事。
修改:在下面的评论中讨论并考虑更多后,我认为选项2 通常更快。只有当一组非常小的值和时,选项1的重复量才会非常大。
答案 1 :(得分:2)
如果您不关心在发生冲突时使用哪个元素,我个人会赞成:
mySettings(key) = Value
这会导致mySettings
包含新元素,因为Item将替换现有元素。
如果您希望保留旧值,那么您的第一个选项是最好的,因为除非密钥是唯一的,否则它不会Add
。
If Not mySettings.ContainsKey(key) Then
mySettings.Add(key, Value)
End If
此行为与上述选项不同 - 主要是因为旧值将保留在指定key
的词典中。
我不会使用第三个选项 - 它将提供与上面的ContainsKey
选项相同的行为,但由于(非显而易见的)异常处理而增加了开销。
答案 2 :(得分:0)
我同意,因为你不关心你得到了什么价值,所有三个人都完成了工作,尽管他们做了不同的事情(第一个和第三个保持原始值,而第二个总是获得最新值)。 / p>
我也同意第二个是最干净的,第三个是个坏主意,因为它依赖于例外情况。
答案 3 :(得分:0)
由于选项1和2做了不同的事情,因此最合适的将取决于您的情况。
例如,我有一个线程安全的字典类,用于缓存基本上可互换的不可变项。在这种情况下,我已重写Add方法以使用您的选项2(当然,通过适当的同步保护)。这意味着多个线程可以在没有竞争条件的情况下添加项目,并使用“last update wins”语义。
另一方面,如果字典存储了可变项,则选项1可能是必不可少的,因为您不希望以静默方式覆盖现有项。