插入可能有重复键的通用字典?

时间:2010-04-02 15:33:29

标签: .net vb.net generics

当插入可能存在密钥冲突的通用字典时,是否有理由支持其中一种方法而不是另一种方法?我正在构建静态集合的内存版本,因此在发生冲突的情况下,使用旧值或新值无关紧要。

If Not mySettings.ContainsKey(key) Then
    mySettings.Add(key, Value)
End If

对战

mySettings(key) = Value

然后当然有这个,这显然不是正确的方法:

Try
    mySettings.Add(key, Value)
Catch
End Try

显然,这里的最大区别是第一种和第二种方法实际上做了不同的事情,但在我的情况下并不重要。似乎第二种方法更清晰,但我很好奇你是否有任何一位.net大师有更深入的见解。谢谢!

4 个答案:

答案 0 :(得分:3)

假设你说替换与否并不重要,我们希望真的挑剔:

选项1优势:

  • 更清楚地表明关键重复是预期的,没问题。
  • 虽然微不足道,但是在有很多重复的情况下它应该稍快一些,因为它通常会避免不必要的分配。这种性能差异很小,即使进行测试也很难感知

选项2的优点:

  • 保存代码行,但在大多数情况下这并不是一个很大的优势。如果代码处于某个狭窄的地方,比如语句lambda或其他东西,则会很有帮助。

除非需要更严格的代码,否则我会投票选项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可能是必不可少的,因为您不希望以静默方式覆盖现有项。