ConcurrentDictionary AddOrUpdate with function

本文关键字:function with AddOrUpdate ConcurrentDictionary | 更新日期: 2023-09-27 18:18:41

我有一个ConcurrentDictionary:

Node n = new Node()
{
    Id = 1,
    Title = "New title"
};
this.nodes.AddOrUpdate((int)n.Id, n, (key, existingVal) =>
    {
        existingVal.Update(n);
        return existingVal;
    });

我的Node类实现了Update,它更新了要更新的对象的所有属性。这工作得很好,但看起来很荒谬,我必须每次都写它,因为它对所有情况都是一样的。

我可以创建一个Func和一个函数使用,因为它总是相同的:

...
new Func<int, Node, Node>(UpdateNode)
...
private Node UpdateNode(int id, Node node)
{
    return node;
}

如何实现可以访问nfunction ?

ConcurrentDictionary AddOrUpdate with function

在原始代码中,n是在闭包中捕获的。由于在声明Func时没有n关闭,因此需要使用不同的Func:

Func<int, Node, Node, Node> myFunc;

现在,这不符合AddOrUpdate参数的定义。这是可以的——你需要传递闭包:

this.nodes.AddOrUpdate((int)n.Id, n, (key, val) => myFunc(key, val, n));

然而,既然我们已经在路上了,为什么不把它做得更好呢?没有什么可以阻止你编写自己的方法来处理所有的

:
public static void AddOrUpdate(this ConcurrentDictionary<int, Node> @this, Node newNode)
{
  @this.AddOrUpdate((int)newNode.Id, newNode, (key, val) => 
    {
      val.Update(newNode);
      return val;
    });
}

Which可以简单地这样使用:

this.nodes.AddOrUpdate(n);