4

我正在尝试创建一个字典,其中包含整数、字符串和布尔数据类型的数组作为值。我想,我应该使用 object[] 作为值,所以声明看起来像这样:

Dictionary<long, object[]> netObjectArray = new Dictionary<long, object[]>();

每当我尝试将其元素的值设置为某个值时,VS 都会说在字典中找不到这样的键。

netObjectArray[key][2] = val; // ex: The given key was not present in the dictionary.

我该如何正确使用它?

UPD1: 不知何故,在抛出此异常之前,以类似的方式使用另一个字典没有问题:

Dictionary<long, Vector2> netPositions = new Dictionary<long, Vector2>();
netPositions[key] = new Vector2(x, y); // works ok

在此本地显示后,该值已分配,字典现在包含该条目。为什么我的其他字典不是这样?

解决方案:在将值写入值数组之前,我们必须首先初始化该数组。这段代码对我有用:

try { netObjectArray[key] = netObjectArray[key]; } // if the object is undefined,
catch { netObjectArray[key] = new object[123]; } // this part will create an object
netObjectArray[key][0] = new Vector2(x, y) as object; // and now we can assign a value to it :)
4

3 回答 3

6

这是预期的:如果密钥不存在于 中Dictionary<K,V>,则尝试读取该密钥失败。key您应该在访问之前为元素分配一个空数组。

当您不知道键是否存在时,这是访问字典的典型模式:

object[] data;
if (!netObjectArray.TryGetValue(key, out data)) {
    data = new object[MyObjCount];
    netObjectArray.Add(key, data);
}
data[2] = val;

编辑(回应问题的编辑)

只有当您尝试使用以前未知的键读取字典时,您才会看到异常。像你这样的作业

netPositions[key] = new Vector2(x, y);

是允许的,即使在分配时该键不在字典中:这将对您的字典执行“插入或更新”操作。

于 2012-04-10T20:22:28.500 回答
1

尝试这样的事情:

Dictionary<long, object[]> netObjectArray = new Dictionary<long, object[]>();
for (int i = 0; i < 100; i++) netObjectArray[i] = new object[100];//This is what you're missing.
netObjectArray[key][2] = val;
于 2012-04-10T20:25:13.660 回答
0
Dictionary<string, object[]> complex = new Dictionary<string, object[]>();

complex.Add("1", new object[] { 1, 2 });

object[] value = complex["1"];
value[1] = val;

为我工作...

于 2012-04-10T20:26:42.343 回答