我有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
?
答案 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);