ConcurrentDictionary AddOrUpdate по предикату - PullRequest
2 голосов
/ 05 марта 2012

У меня есть ConcurrentDictionary.Я использую метод AddOrUpdate для манипулирования его элементами.

Мой вопрос: возможно ли использовать параметр обновления AddOrUpdate, чтобы содержать оператор if?Например, my ConcurrentDictionary содержит объекты со строковым идентификатором и свойствами DateTime Date.

Я бы хотел - добавить к нему новый объект, если объект с данным Id не существует, - обновить его, если дата нового объекта равна или больше, чем существующая, если онменьше, чем ничего не делает.

В моем примере:

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

Я должен изменить

(k, v) => v

на

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

Ответы [ 2 ]

4 голосов
/ 05 марта 2012

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;
});
3 голосов
/ 05 марта 2012

Простой способ добиться этого - ваша updateValueFactory лямбда возвращает оригинальное значение, если новое значение не больше:

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