ConcurrentDictionary AddOrUpdate与函数

时间:2015-10-21 07:53:03

标签: c# concurrentdictionary

我有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;
}

如何实施function我还可以访问n

1 个答案:

答案 0 :(得分:4)

在原始代码中,n会在闭包中捕获。由于您在声明n时未将Func关闭,因此您需要使用其他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;
    });
}

可以这样使用:

this.nodes.AddOrUpdate(n);