Как я могу использовать AddOrUpdate .NET ConcurrentDictionary с моим пользовательским POCO?

Я не уверен, как написать часть func метода ConcurrentDictionary.AddOrUpdate, которая должна проверять, больше ли свойство UpdatedOn существующего ключа/значения или равно ему.

Учитывая следующий POCO, как я могу использовать .NET ConcurrentDictionary.AddOrUpdate для обновления элемента в словаре (если он существует), когда новый элемент имеет значение DateTime, которое БОЛЬШЕ, ЧЕМ существующее... иначе он просто добавляет его.

(псевдоним код)

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 часть метода.


person Pure.Krome    schedule 27.05.2014    source источник
comment
В чем ключ и ценность вашего использования с ConcurrentDictionay   -  person Yuval Itzchakov    schedule 27.05.2014


Ответы (1)


Ожидается, что рассматриваемый параметр функции примет ключ и уже существующее значение для этого ключа и вернет значение, которое должно храниться в словаре для этого самого ключа.

Поэтому, если вы хотите обновить существующее значение, просто создайте функцию, которая обновляет значение и возвращает его вместо нового.


Вот полный пример:

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.

person sloth    schedule 27.05.2014