使用struct作为Dictionary值时遇KeyNotFoundException问题求助
问题分析与解决
为什么会抛出KeyNotFoundException?
你执行inv_stored[1].demand = 4时,首先会尝试读取字典中键为1的值,但字典里根本没有添加过键1的条目。Dictionary的索引器行为规则是:
- 当你用
dict[key] = value赋值时,如果键不存在会自动添加新的键值对; - 但当你读取
dict[key]时,如果键不存在就会抛出KeyNotFoundException。
你的代码是先读取inv_stored[1]再修改它的属性,第一步读取操作就触发了异常。
另一个隐藏问题:struct值类型的特性
就算你先添加了键1的条目,比如inv_stored[1] = new data_inv();,之后执行inv_stored[1].demand = 4也不会生效。因为struct是值类型,inv_stored[1]返回的是字典中存储实例的副本,你修改的是这个副本的属性,修改完成后副本就被丢弃了,字典里的原数据不会有任何变化。
正确的解决方法
1. 先确保键存在于字典中
在操作之前,必须先把键1的条目添加到字典里:
// 直接赋值添加(如果键已存在会覆盖原有值) inv_stored[1] = new data_inv(); // 或者用TryAdd更安全(避免覆盖已有键的值) inv_stored.TryAdd(1, new data_inv());
2. 修改值类型属性的正确方式
因为struct是值类型,需要先取出副本,修改后再存回字典:
// 取出字典中的值副本 var tempItem = inv_stored[1]; // 修改副本的属性 tempItem.demand = 4; // 将修改后的副本重新存入字典 inv_stored[1] = tempItem;
3. 可选:改用class简化操作
如果觉得值类型的操作太繁琐,可以把data_inv改成类(class)——类是引用类型,直接修改属性就会作用于字典中的实例:
public class data_inv { public float inventory; public float supply; public float demand; }
这种情况下,只要键1已存在,直接执行inv_stored[1].demand = 4就能正确修改属性。
内容的提问来源于stack exchange,提问作者Specterhy
相关产品推荐
相关产品推荐

