2012-04-10 67 views
4

我正在试图创建一个带整数,字符串和布尔型数据类型数组的字典作为值。我想,我应该使用对象[]作为值,所以声明看起来如此:不同数据类型的数组作为值的字典

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

有你'初始化netObjectArray [关键]'至少'新的对象[2]'? – 2012-04-10 20:19:39

+3

此外,在Dictionary中存储这样的不同类型是一种糟糕的代码异味。你真的需要吗,还是可以用更好的格式封装数据? – 2012-04-10 20:22:30

+0

您可以使用'Tuple '作为值。 http://msdn.microsoft.com/en-us/library/system.tuple.aspx – 2012-04-10 20:25:13

回答

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; 
+0

你能解释为什么我会在数组字典中忽略它,而通常的字典没有它可以正常工作吗? – user1306322 2012-04-10 20:39:05

+1

我的猜测是:在你的'Dictionary '中,你在'netPositions [key]'中放入了一个'Vector2',这就是你应该做的。在'Dictionary '中,你不会把'object []'放在'netObjectArray [key]'中(这是你应该做的)。你正在跳过一步。您试图访问不存在的对象[]'。 – ispiro 2012-04-10 20:55:19

+0

是的,我试图写一个值到以前未定义的数组中。好眼睛。 – user1306322 2012-04-10 20:56:57

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); 

是允许的,即使关键是不在字典在转让时:这在你的字典执行“插入或更新”操作。

+0

那么'netPositions [key] = new Vector2(x,y);'不会引发异常,而'netObjectArray [key] [2] = val;'接下来会怎样呢?它是允许的“新”部分吗?简单地设置不是? – user1306322 2012-04-10 20:47:51

+0

@ user1306322请参阅我的编辑。实质上,不允许读取未知密钥,但写入未知密钥是可以的。 – dasblinkenlight 2012-04-10 20:51:52

+0

我的评论是对你的编辑的回应。据我所知,我连续写了两个以前未定义的值。你说要抛出异常,我需要尝试在选定的位置读取一个未定义的值,但我没有在代码中的任何地方执行它。 **好吧,虚警**答案在下面的评论[http://stackoverflow.com/questions/10095835/dictionary-with-array-of-different-data-types-as-value/10095939#comment12932296_10095939] – user1306322 2012-04-10 20:55:31

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

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

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

作品对我来说...

相关问题