Ich habe eine List<Thing> things
, wo eine Anzahl von Thing
s häufig durch Nachschlagen einer Kombination von zwei Variablen T1 f1
und T2 f2
, die Werttypen sind abgerufen werden müssen. So wie ich das jetzt mache ist einfach things.Where(t => t.Field1 == f1 && t.Field2 == f2)
. Allerdings mache ich sehr viele dieser Nachschlagevorgänge häufig und benötige eine effektivere Methode.Wörterbuch unterstützt doppelte, mehrdimensionale Schlüssel?
Glücklicherweise müssen things
Elemente nicht entfernt oder hinzugefügt werden, so dass ich dachte, die Liste auf Konstruktion zu analysieren und zu einer Dictionary<T1, Lookup<T2, Thing>>
hinzuzufügen. Dies fühlt sich jedoch chaotisch an, insbesondere mit dem zusätzlichen Parsing. Und es wird sehr haarig, wenn ich noch mehr Felder nachschlagen muss. Drei Felder würden wie Dictionary<T1, Dictionary<T2, Lookup<T3, Thing>>>
aussehen.
Mein nächster Gedanke war, eine Lookup<Tuple<T1,T2,T3,...>,Thing>
zu machen. Aber in diesem Fall bin ich nicht sicher, ob die Schlüssel tatsächlich funktionieren, weil Tuple ein Referenztyp ist.
Selbst wenn ich einen Lookup<ValueType<T1,T2,T3,...>,Thing> things
machen, wird die Lookup-Anweisung so etwas wie things[new ValueType<T1,T2,T3,...>(f1, f2, f3, ...)]
sein, die ziemlich hässlich ist (und ich bin immer noch nicht sicher, ob ich diese Schlüssel vertrauen konnte).
Gibt es eine elegantere Lösung, die die Leistungsvorteile einer Hashtable hält und wo ich einfach etwas wie IEnumerable<Thing> found = things[f1, f2, f3, ...];
eingeben könnte?
Haben Sie in Betracht gezogen, etwas wie eine SQLite in der Speicherdatenbank zu verwenden? – CodingGorilla
Hat 'Thing' einen Identifikationsfaktor (ID, PrimaryKey oder was auch immer)? –
[C# Mehrtasten-Generisches Wörterbuch] (http://www.codeproject.com/Articles/32894/C-Multi-key-Generic-Dictionary) –