2015-06-14 2 views
1

У меня есть Dictionary<Product, int> Inventory, в котором содержится инвентарь для продуктов, находящихся в магазине.Добавить в значение в словаре

Как получить значение, соответствующее Product, и добавить 1 к нему?

Также возможно, что в словаре нет Product.

+0

Что о предмете, который не был еще в наличии? Это существует в вашем словаре со значением нуля или отсутствует в вашем словаре? Текущий ответ предполагает, что он уже существует. – hvd

+0

@hvd действительная точка, возможно, что продукт не существует в словаре. –

+1

Будьте осторожны с использованием продукта в качестве ключа в словаре. По умолчанию для классов используется ссылочное равенство. Если один продукт всегда представлен одним и тем же экземпляром класса (объектом), это нормально. В противном случае используйте идентификатор продукта в качестве ключа или переопределите 'Equals' и' GetHashcode' для класса. –

ответ

3

Что-то вроде этого?

myDictionary[myProduct] += stockIncrease; 

Это почти точно такой синтаксис, который вы бы использовали для обновления элемента в массиве.

Если это помогает, подумайте об этом меньше с точки зрения «Я хочу, чтобы акции выросли» и более с точки зрения «как получить нужную мне ценность и что я могу сделать с этим значением»? ,

Если это не гарантирует того, существует ли или не ваш продукт в словаре, чтобы начать с, а затем просто добавить на Условные проверках:

if (!inventory.ContainsKey(myProduct)) { 
    inventory[myProduct] = 0; 
} 
inventory[myProduct] += stockIncrease; 
+0

или 'if (! Inventory.ContainsKey (myProduct)) { инвентарь [myProduct] = 1; } else { инвентарь [myProduct] + = stock_increase; } 'во избежание доступа к словарю 3 раза. –

+0

@ OlivierJacot-Descombes, который все еще обращается к словарю три раза. Сначала в вызове 'ContainsKey', затем в свойство getter для' inventory [myProduct] 'и, наконец, в установщике свойств для' inventory [myProduct] '. – hvd

+0

@ OlivierJacot-Descombes - Я понял, что HashMaps - это O (1), я мог бы выбрать способ, который выглядит мне самым чистым, и не беспокоиться об эффективности, но да, ваш путь должен работать так же хорошо (хотя вы, вероятно, захотите изначально устанавливали размер инвентаря на 'stockIncrease', чтобы оставаться постоянным) – Michael0x2a

2

Чтобы справиться с элементами, которые еще не существуют в словаре мой лично предпочтительным способом является использование TryGetValue:

int stock; 
inventory.TryGetValue(product, out stock); 
inventory[product] = stock + 1; 

Это работает, потому что TryGetValue наборы stock к default(int), который 0, если продукт еще не существует. 0 - это именно то значение, которое вы хотите.

Если вы предпочитаете рассматривать значение stock как Unassigned после TryGetValue возвращает false (для удобства чтения), то вы можете использовать этот же общий подход:

int stock; 
if (!inventory.TryGetValue(product, out stock)) 
    stock = 0; 
inventory[product] = stock + 1; 
Смежные вопросы