字典与不同数据类型的数组作为值

时间:2012-04-10 20:17:18

标签: c# arrays dictionary

我正在尝试使用整数,字符串和布尔数据类型的数组作为值创建一个Dictionary。我想,我应该使用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 :)

3 个答案:

答案 0 :(得分: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);
允许使用

,即使在分配时密钥不在字典中:这会对您的字典执行“插入或更新”操作。

答案 1 :(得分: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;

答案 2 :(得分:0)

Dictionary<string, object[]> complex = new Dictionary<string, object[]>();

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

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

适合我...