如何在ConcurrentDictionary中设置一个值,无论它是否包含Key

时间:2014-02-05 18:00:05

标签: c# concurrentdictionary

首先,使用索引编号(例如myConcurrentDictionary[someKey] = someValue;)简单地将项添加到并发字典是否安全?

我很困惑,因为它隐藏了IDictionary方法(例如Add)。

为什么AddOrUpdate()需要func来更新值?是否有方法设置密钥的值,无论密钥是否已存在?

我无法从MSDN页面收集到这些内容。

2 个答案:

答案 0 :(得分:20)

  1. 是的,如果您想添加或替换值,使用索引器应该绝对正常。

  2. AddOrUpdate接受一个委托,以便您可以将“旧”和“新”值合并在一起,以形成您希望在字典中的值。如果您不关心旧值,请改用索引器。

  3. 索引器 是“设置密钥值的方式,无论密钥是否已存在”,就像在任何其他IDictionary<,>实现中一样。

  4. documentation底部有一个整洁的部分 - 一种配方 - 包括:

      

    要做到这一点......
      无条件地将键/值对存储在字典中,并覆盖已存在的键的值

         

    使用此方法
      索引器的setter:dictionary[key] = newValue

    因此它被正式批准。

答案 1 :(得分:2)

索引器将找到由给定键表示的对,如果它不存在则添加它,并将该值替换为给定值(如果它存在)。从字典的角度来看,该操作在逻辑上是“原子的”。当多个线程同时通过其索引器访问字典时,您不必担心字典被损坏。

Add被隐藏,因为您通常应该使用TryAdd。如果在检查密钥是否存在后由另一个线程添加该密钥,则添加可能会失败。这当然不是索引器的问题。如果另一个线程在当前线程之前添加了该项,它只会覆盖该值,而不是抛出异常。

AddOrUpdated为更新提供了一个函数,原因有两个:

  1. 它可以使用先前的值来确定更新的值。
  2. 生成更新后的值可能会产生副作用,或者计算成本很高。使它成为一个函数允许延迟此操作,直到您知道您确实需要更新项目。