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;
}
如何实现可以访问n
的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);