2012-11-01 20 views
7

Eventuali duplicati:
Is there an alternative to Dictionary/SortedList that allows duplicates?dizionario con duplicato chiave

Sto cercando una sorta di dizionario di classe che può avere chiavi duplicate.

Io lo cerco e ho trovato che la classe LookUp può usare per memorizzare chiavi duplicate, ma non ha un costruttore predefinito, quindi non possiamo inizializzarlo senza alcun altro oggetto su LookUp.

Ma inizialmente non ho alcun oggetto di questo tipo dal quale sia possibile inizializzare un oggetto LookUp.

Quindi, la mia domanda è, Esiste qualche classe in .Net framework 3.5, che si comporta come Dizionario ma mi consente di avere chiavi duplicate come LookUp?

+7

Posso chiedere perché desideri la chiave duplicata? Potresti invece memorizzare un array come valore. – LightStriker

+0

@ Marc-AndréJutras, Sì, voglio archiviare l'azione dell'utente con il suo contenuto interessato così, posso eseguire un'operazione di fusione simile su quell'oggetto interessato. Posso fare questo uno per uno, ma è dispendioso in termini di tempo, quindi li sto semplicemente archiviando e poi eseguo in un singolo, quindi solo quell'azione richiede tempo non tutti. –

+0

Che ne dici di usare 'Dictionary >' invece di 'Dictinary ', simile a Ricerca? –

risposta

12

Un dizionario, per definizione, non sarà mai in grado di avere più chiavi con lo stesso valore. (Se hai cercato una chiave qualunque cosa vorresti tornare?) Anche una ricerca, a cui fai riferimento, non lo consente. Che cosa è può fare è che ogni chiave si riferisce a più valori (logicamente, non tecnicamente). Questo viene fatto avendo un dizionario in cui il valore è una struttura di dati di qualche tipo (ad esempio, un List) che contiene tutti i valori che corrispondono a quella particolare chiave.

+1

Questo sarebbe qualcosa come Ninject ['MultiMap'] (https://github.com/ninject/ninject/blob/d663e013632780ca3d47818b7ba372a103a4ac9d/src/Ninject/Infrastructure/Multimap.cs) – khellang

+1

Io uso' Dizionario > '(o simile) tutto il tempo. – Bobson

+1

@khellang Sì, è solo un wrapper attorno a un 'dizionario >'; in realtà non fa molto per te, ma fa un po '. Di solito trovo che lavorare direttamente con 'Dictionary >' sia abbastanza semplice, come menziona Bobson. – Servy

19

È possibile creare un elenco di coppie di valori chiave.

List<KeyValuePair<string,int>> 
+2

Ma poi non è logicamente un dizionario, è solo un elenco di coppie. (Che potrebbe essere proprio ciò di cui ha bisogno/vuole, sono solo tecnico.) – Servy

+0

Ma poi il recupero delle chiavi ne risentirebbe. Un dizionario è fatto per essere veloce nella ricerca chiave. – LightStriker

+0

Vero, ma non sono sicuro di come si possa avere qualcosa che permetta chiavi duplicate e mantenga i vantaggi di un dizionario. Quello che sembra è che dovrebbe usare un dizionario con un elenco di valori in modo che quando una chiave viene duplicata, il secondo valore viene aggiunto alla lista e entrambi vengono recuperati quando si cerca la chiave. [Modifica: Cosa Servy ha detto nella sua risposta, aumentando la sua risposta] – madeFromCode

3

È possibile comporre un tipo del corpo utilizzando un dizionario di liste, Dictionary<TKey, List<TValue>>

È possibile creare una classe che eredita da quella classe e aggiungere adatti aggiuntivi metodi ecc che gestisce la creazione di un nuovo elenco per il primo oggetto su un dato chiave.

+0

Sai, io uso questa struttura per tutto il tempo, ma non ho mai pensato di creare una classe per gestirla. Avevo fatto alcuni metodi di estensione, ma non una classe. Buona idea. – Bobson