2012-04-02 14 views
2

Ich arbeite derzeit an einem Projekt, das ein Wörterbuch mit einem int-Index der Instanz und einem komplexen Typ als Wert erstellt. Da es sich um ein riesiges Schulprojekt handelt, möchte ich nicht viel Code veröffentlichen, da ich eher ein logisches Problem habe als ein "Ich brauche Code". Ich werde versuchen, so klar wie möglich zu sein, und wenn es etwas gibt, was ich besser erklären muss, lass es mich wissen.Instancing mit einem Wörterbuch

Zunächst. Ich habe ein Wörterbuch in meinem Server:

private Dictionary<int,List<complexType>> dictName = new Dictionary<int,List<complexType>> 

Jedes Mal, wenn ein Kunde es startet mit dem Wörterbuch registriert (i erstellen Sie einen leeren komplexen Typen es instanziiert dann lade ich das Wörterbuch):

List<complexType> temp = null; 
dictName.Add(id,temp) 

dann, wenn die Zeit kommt, dass ich für eine bestimmte Instanz zu der Liste hinzufügen möchte ich dies tun:

complexType myItem = new complexType(); 
dictName[id].Add(myItem); 

wenn ich diesen Code ausführen bekomme ich einen Fehler, wenn ein zweiter Client auszuführen versucht:

„eine nicht behandelte Ausnahme des Typs 'System.Reflection.TargetInvocationException' aufgetreten in mscorlib.dll. Weitere Informationen: Die Ausnahme wurde durch das Ziel eines Aufrufs ausgelöst.

Jetzt geschieht dies, wenn der zweite Benutzer hit: dictName.Add(id,temp) aus dem ersten Teil.

Wenn ich die Instanziierung temp List<complexType> temp = new List<complexType>(); ändern

dann geht es, dass vor Ort, aber ich bekomme die gleichen Fehler wieder, wenn es die Kunden aktualisiert.

Ich verwende derzeit diese Art der Weitergabe von Daten mit int und String (Wörterbuch) und sie funktionieren gut, aber wenn ich in eine Liste eines komplexen Typs im Wörterbuch hinzugefügt habe, habe ich den obigen Fehler.

Wenn jemand irgendwelche Vorschläge hat, würde ich es sehr zu schätzen wissen. Ich hoffe, dass es etwas mit meiner anfänglichen Ladung einer leeren Liste zu tun hat. Wenn Sie noch etwas wissen müssen, fragen Sie bitte Danke!

+2

Was ist die Ausnahme? Die gepostete Ausnahme * sollte eine InnerException-Eigenschaft haben. Kannst du uns sagen, was es ist? – spender

+0

@spender Ich schaute und es scheint nicht zu haben ... wenn ich durch Debug es nur zufällig die Break-Anweisung mit der Ausnahme, die ich oben zeigte. Dann öffnet sich eine Registerkarte, die besagt, dass keine Quelle verfügbar ist. Ich habe auch versucht, einen Versuch zu fangen, um Informationen zu bekommen, aber es gibt nicht den Haken – user1219627

+0

Versuchen Sie, es von verschiedenen Threads zugreifen? –

Antwort

1

Sie ein Wörterbuch von Listen zu machen.Sie haben also versucht, zu einer Liste hinzuzufügen, die null war, und das war die erste Ausnahme.

Zweitens habe ich noch nie das "neue private Wörterbuch" gesehen, ist das ein Tippfehler?

Dies funktioniert:

Dictionary<int, List<string>> dictName = new Dictionary<int, List<string>>(); 
dictName.Add(0, new List<string>()); 
dictName[0].Add("First"); 
dictName.Add(1, new List<string>()); 
dictName[1].Add("Second"); 

Die Tatsache, dass Sie die Liste eines komplexen Typs haben, und ich habe Liste von Strings sollte keine Rolle spielen.

0

Sieht aus wie Sie den Wörterbucheintrag als initialisieren sollten:

dictName.Add(id, new List<complexType>()); 

Sie auch den generischen Lookup-Typen kann versuchen verwenden, die im Grunde genau das, was Sie brauchen - Schlüssel zu einer Liste von Werten.

var lookupName = new Lookup<int, complexType>(); 

lookup.Add(id, new complexType()); // Creates key 'id' and adds new ct. 
lookup.Add(id, new complexType()); // Adds new ct to existing key 'id' 
lookup.Add(651, null); // Creates key 651 and adds null 

So können Sie nur die Add-Methode verwenden, um komplexe Typinstanzen zu einem id-Schlüssel hinzufügen, ohne auch nur zu denken, ob der Schlüssel vorhanden ist oder nicht.

lookup[id] 

Gibt Ihnen einen IEnumerable der komplexen Typen zurück, die mit der angegebenen ID verknüpft sind.

Beispiel:

var lu = new Lookup<int, string>(); 

lu.Add(7, "Seven"); 
lu.Add(7, "SEVEN"); 
lu.Add(4, "Four"); 
lu.Add(7, "7"); 
lu.Add(4, "FOUR"); 
lu.Add(4, "FOUR"); 

Console.WriteLine(string.Join(", ", lu[7])); // "Seven, SEVEN, 7" 
Console.WriteLine(string.Join(", ", lu[4])); // "Four, FOUR, FOUR" 

foreach (var grp in lu) 
{ 
    int id = grp.Key; 

    foreach (var str in grp) 
    { 
     ... 
    } 
} 
+0

Ich ändere die Installation, aber wenn ich das "dictName [ID] .Add (myItem)" mache, möchte ich der Liste für diese ID hinzufügen, nicht eine neue Liste jedes Mal, wenn ich Ihren Code falsch interpretiere. – user1219627

+0

Lookup hat eine Liste für jeden Schlüssel, und wenn Sie die add-Methode verwenden, wie ich gezeigt habe, erstellt es einen neuen Schlüssel und eine neue Liste, wenn der Schlüssel nicht existiert, und ergänzt die vorhandene Liste, falls dies der Fall ist. Versuch es. – SimpleVar

+0

@ user1219627 Ich habe ein weiteres Beispiel für die Verwendung von Lookup hinzugefügt. – SimpleVar

0

auf diese Weise versuchen:

Dictionary<int, List<string>> dictName = new Dictionary<int, List<string>>(); 
dictName.Add(0, null); 
dictName[0] = new List<string>(); 
dictName[0].Add("Hello"); 
Verwandte Themen