2012-04-10 65 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; 

作品對我來說...

相關問題