2015-01-29 7 views
0

Я хотел бы инициализировать значение 0, если он еще не существует. В противном случае он должен увеличивать существующее значение.Попытка понять, как работает ConcurrentDictionary

ConcurrentDictionary<int, int> dic = new ConcurrentDictionary<int, int>(); 
dic.AddOrUpdate(1, 0, (key, old) => old++); 
dic.AddOrUpdate(2, 0, (key, old) => old++); 

В этот момент словарь имеет ключи 1 и 2 со значением 0 каждый.

 dic.AddOrUpdate(1, 0, (key, old) => old++); 

На данный момент для ключа 1 значения должны быть 1, тогда как для ключа 2 должно быть 0, однако, оба имеют значение 0. Любая идея, почему?

+0

извините моя ошибка. Обновленный вопрос –

+3

См. Eric lippert ответ здесь: http: //stackoverflow.com/questions/3346450/what-is-the-difference-between-i-and-i и определенно не принятый ответ. –

ответ

4

У вас есть ошибочное мнение:

dic.AddOrUpdate(1, 0, (key, old) => old++); 

На данный момент для ключа 1, то значение должно быть 1

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

dic.AddOrUpdate(1, 0, (key, old) => 
{ 
    var original = old; 
    old = old + 1; 
    return original; 
}); 

Вы хотите ++old, которая будет возвращать измененное значение или просто использовать

dic.AddOrUpdate(1, 0, (key, old) => old + 1); 
+0

Или просто 'old + 1' для наглядности. –

+0

Извините, у меня были ошибки в моем вопросе. Исправлено это сейчас –

+0

, но вы ответили, что я делал неправильно –

1

Попробуйте это:

dic.AddOrUpdate(1, 0, (key, old) => old + 1); 

Я думаю, что это потому, что old является параметром Func <>, он не может быть изменен.

+1

Это не значит, что старый не может быть изменен, так как 'old ++' возвращает значение до инкремента, когда вам нужно значение после. Так что '++ old' также будет работать. – juharr

+0

Вы можете изменить 'old', это просто, что он ничего не делает * ничего. Значение будет установлено на то, что возвращает лямбда, а не то, что значение 'old' находится в конце метода. – Servy

 Смежные вопросы

  • Нет связанных вопросов^_^