Ho un List<Thing> things
, dove è necessario recuperare frequentemente un numero di Thing
s cercando una combinazione di due variabili T1 f1
e T2 f2
, che sono tipi di valore. Il modo in cui lo faccio ora è semplicemente things.Where(t => t.Field1 == f1 && t.Field2 == f2)
. Tuttavia, faccio molte di queste ricerche frequentemente e ho bisogno di un metodo più efficace.Il dizionario supporta chiavi duplicate e multidimensionali?
Fortunatamente, non è necessario che gli elementi things
siano stati rimossi o aggiunti, quindi ho pensato di analizzare l'elenco in fase di costruzione e aggiungerlo a Dictionary<T1, Lookup<T2, Thing>>
. Tuttavia, questo sembra disordinato, specialmente con l'analisi aggiunta. E diventa davvero peloso se ho bisogno di cercare ancora più campi. Tre campi apparirebbero come Dictionary<T1, Dictionary<T2, Lookup<T3, Thing>>>
.
Il mio prossimo pensiero è stato quello di fare un Lookup<Tuple<T1,T2,T3,...>,Thing>
. Ma in questo caso, non sono sicuro se i tasti funzioneranno effettivamente perché Tuple è un tipo di riferimento.
Anche se faccio un Lookup<ValueType<T1,T2,T3,...>,Thing> things
, la dichiarazione di ricerca sarà qualcosa come things[new ValueType<T1,T2,T3,...>(f1, f2, f3, ...)]
che è piuttosto brutto (e non sono ancora sicuro se potrei fidarmi di quelle chiavi).
Esiste una soluzione più elegante a questo che mantiene i vantaggi delle prestazioni di un hashtable e dove potrei semplicemente digitare qualcosa come IEnumerable<Thing> found = things[f1, f2, f3, ...];
?
Hai mai pensato di utilizzare qualcosa come un SQLite nel database di memoria? – CodingGorilla
Does Thing? Ha una proprietà di identificazione (ID, PrimaryKey o qualsiasi altra cosa)? –
[Dizionario generico multi-chiave C#] (http://www.codeproject.com/Articles/32894/C-Multi-key-Generic-Dictionary) –