You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:20:14