2015-06-14 61 views
1

我有一个Dictionary<Product, int> Inventory其中包含店内产品的库存。新增数值字典

如何获得与Product相对应的值并将其添加1?

Product也可能不在字典中。

+0

怎么样,这是没有库存的项目?这是否存在于你的字典中,值为零,还是从字典中丢失?当前的答案假定它已经存在。 – hvd

+0

@ hvd有效点,该字典中可能不存在该产品。 –

+1

请谨慎使用该产品作为字典中的关键字。默认情况下,引用相等被用于类。如果一个产品总是由相同的类实例(对象)表示,那么这是可以的。否则,使用产品ID作为键或覆盖该类的'Equals'和'GetHashcode'。 –

回答

3

这样的事情?

myDictionary[myProduct] += stockIncrease; 

这几乎就是您用来更新数组中项目的语法。

如果有帮助,可以从“我希望股票上涨”以及“我如何获得我需要的价值以及如何利用该价值做什么”等角度来考虑它。 。

如果它不能保证你的字典开始,然后只需添加上的,如果检查是否存在产品:

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

或'if(!inventory.ContainsKey(myProduct)){ inventory [myProduct] = 1; } else { inventory [myProduct] + = stock_increase; }'为了避免访问字典3次。 –

+0

@ OlivierJacot-Descombes仍然可以访问字典三次。首先调用“ContainsKey”,然后在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; 

这工作,因为TryGetValuestockdefault(int),这是0,如果产品不存在。 0正是您想要的值。

如果你喜欢后TryGetValue返回false(为便于阅读)治疗stock值未分配的,那么你仍然可以使用相同的通用方法:

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