1

我不确定如何编写方法的func一部分ConcurrentDictionary.AddOrUpdate,即检查UpdatedOn属性是否大于或等于现有键/值。

鉴于以下 POCO,当新项目的 DateTime 值大于现有项目时,我如何使用 .NETConcurrentDictionary.AddOrUpdate更新字典中的项目(如果存在)......否则它只是添加它。

(伪代码)

var results = new ConcurrentDictionary<string, Foo>();

public class Foo
{
    string Id;
    string Name;
    string Whatever;
    DateTime UpdatedOn;
}

我一直在查看第二个重载方法( AddOrUpdate(TKey, TValue, Func<TKey, TValue, TValue>)),但我只是不确定如何执行该Func方法的一部分。

4

1 回答 1

2

所讨论的函数参数预计将接收键和该键的现有值,并返回一个值,该值应保存在该键的字典中。

因此,如果您想更新现有值,只需创建一个更新值并返回它而不是新值的函数。


这是一个完整的例子:

var d = new ConcurrentDictionary<string, Foo>();

// an example value
var original_value = new Foo {UpdatedOn = new DateTime(1990, 1, 1)};
d.TryAdd("0", original_value);

var newValue = new Foo {UpdatedOn = new DateTime(2000, 1, 1)};

// try to add the newValue with the same key
d.AddOrUpdate("0", 
              newValue,  
              (key, old_value) => {

                // if the DateTime value is greater,
                // then update the existing value
                if (newValue.UpdatedOn > old_value.UpdatedOn)
                    old_value.UpdatedOn = newValue.UpdatedOn;

                // return old_value, since it should be updated
                // instead of being replaced
                return old_value;
            });

d现在将只包含UpdatedOn更新为 2000-1-1 的原始元素。

于 2014-05-27T12:21:49.467 回答