ConcurrentDictionary由谓词AddOrUpdate

时间:2012-03-05 16:20:39

标签: c# .net .net-4.0 concurrentdictionary

我有ConcurrentDictionary。我使用它的AddOrUpdate方法来操纵它的项目。

我的问题是:是否可以使用AddOrUpdate的update参数来包含if语句?例如。我的ConcurrentDictionary包含具有字符串Id和DateTime Date属性的对象。

我想 - 如果具有给定Id的对象不存在,则向其添加新对象 - 如果新对象的Date等于或大于现有的Date,则更新它,如果它小于,则不更新。

在我的例子中:

Dictionary.AddOrUpdate(testObject.Id,testObject,(k, v) => v);

我应该改变

(k, v) => v

if(v.Date >= existingItem.Date) (k, v) => v
else do nothing

2 个答案:

答案 0 :(得分:4)

v是集合中当前存在的值,所以不做任何事情只返回它。

Dictionary.AddOrUpdate(testObject.Id,testObject,(k, v) => 
    (v.Date >= existingItem.Date) ? testObject : v);

更具可读性:

Dictionary.AddOrUpdate(testObject.Id,testObject,(k, v) => 
{
    if(v.Date >= existingItem.Date) 
        return testObject; 
    else
        return v;
});

答案 1 :(得分:3)

实现此目的的一种简单方法是,如果新值不大,您的updateValueFactory lambda将返回原始值:

Dictionary.AddOrUpdate(testObject.Id, testObject,
    (key, value) => testObject.Date > value.Date ? testObject : value);