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

1

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

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

(код pseduo)

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

Теги:
concurrentdictionary

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню