2012-04-10 8 views
4

Ich versuche, ein Dictionary mit Array von Ganzzahl, String und booleschen Datentypen als Werte zu erstellen. Ich dachte, ich sollte Objekt verwenden [] als Wert, so Deklaration so aussehen:Wörterbuch mit Array von verschiedenen Datentypen als Wert

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

Immer wenn ich versuche ihr Element den Wert auf etwas einstellen, VS sagt, daß es keine solche Schlüssel im Wörterbuch gefunden wurde.

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

Wie arbeite ich damit richtig?

UPD1: Irgendwie Recht vor, diese Ausnahme zu werfen, die andere Wörterbuch ohne Probleme in ähnlicher Weise verwendet:

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

Nach dieser Einheimischen der Wert zeigen, wurde zugewiesen und Wörterbuch enthält jetzt den Eintrag . Warum ist das bei meinem anderen Wörterbuch nicht der Fall?

Lösung: Bevor Sie einen Wert in ein Array von Werten schreiben, müssen wir zuerst dieses Array initialisieren. Dieser Code funktioniert für mich:

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

Haben Sie initialisierten 'netObjectArray [key]' mindestens 'neues Objekt [2]'? –

+3

Außerdem ist das Speichern verschiedener Typen wie dieses in einem Dictionary ein schlechter Code-Geruch. Brauchen Sie das wirklich oder können Sie die Daten in einem besseren Format kapseln? –

+0

Sie könnten stattdessen ein 'Tuple ' als Wert verwenden. http://msdn.microsoft.com/en-us/library/system.tuple.aspx –

Antwort

1

so etwas wie dieses Versuchen:

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

Können Sie erklären, warum ich es im Array-Wörterbuch vermisse und das übliche Wörterbuch funktioniert ohne es gut? – user1306322

+1

Meine Vermutung ist: In Ihrem 'Dictionary ' setzen Sie ein 'Vector2' in' netPositions [key] ', was Sie tun sollten. In 'Dictionary ' hast du _not_ kein 'object []' in 'netObjectArray [key]' gesetzt (was du eigentlich machen sollst). Du überspringst einen Schritt. Sie versuchen, auf ein nicht vorhandenes 'Objekt []' zuzugreifen. – ispiro

+0

Ja, ich versuche, einen Wert in ein zuvor undefiniertes Array dieser Werte zu schreiben. Gutes Auge. – user1306322

6

Dies ist zu erwarten: Wenn der Schlüssel nicht in den Dictionary<K,V> ist ein Versuch, zu lesen, auf der Taste nicht. Sie sollten dem Element bei key ein leeres Array zuweisen, bevor Sie darauf zugreifen. Hier

ist das typische Muster ein Wörterbuch für den Zugriff, wenn Sie nicht wissen, wenn der Schlüssel vorhanden ist oder nicht:

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

EDIT (in Reaktion auf die Bearbeitung der Frage)

Sie sehen nur dann eine Ausnahme, wenn Sie versuchen, das Wörterbuch mit dem zuvor unbekannten Schlüssel zu lesen. Zuordnungen wie der Ihre

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

erlaubt ist, auch wenn der Schlüssel nicht im Wörterbuch zu dem Zeitpunkt des Auftrags ist: dies führt ein „einfügen oder aktualisieren“ -Betrieb auf Ihrem Wörterbuch.

+0

Dann wie 'netPositions [key] = new Vector2 (x, y);' keine Ausnahme verursachen, während 'netObjectArray [key] [2] = val;' was geht als nächstes, tut? Ist es der "neue" Teil, der erlaubt ist und einfach nicht eingestellt wird? – user1306322

+0

@ user1306322 Bitte sehen Sie meine Bearbeitung. Im Wesentlichen ist das Lesen eines unbekannten Schlüssels nicht erlaubt, aber das Schreiben eines unbekannten Schlüssels ist OK. – dasblinkenlight

+0

Mein Kommentar war die Antwort auf Ihre Bearbeitung. Wie ich es verstehe, schreibe ich nacheinander auf zwei vorher nicht definierte Werte. Sie sagen, dass diese Ausnahme ausgelöst werden soll. Ich muss versuchen, einen nicht definierten Wert an der ausgewählten Position zu lesen, aber ich tue es nicht irgendwo im Code. ** ok, falscher Alarm ** Die Antwort ist im Kommentar unten [http://stackoverflow.com/questions/10095835/dictionary-with-array-of-different-data-types-asvalue/10095939#comment12932296_10095939] – user1306322

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

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

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

Arbeiten für mich ...

Verwandte Themen