2010-09-03 11 views
25

Ho bisogno di un dizionario come oggetto che può memorizzare più voci con la stessa chiave. È disponibile come collezione standard o devo eseguire il rollover da solo?Un dizionario con più voci con la stessa chiave

Per chiarire, io voglio essere in grado di fare qualcosa del genere:

var dict = new Dictionary<int, String>(); 
dict.Add(1, "first"); 
dict.Add(1, "second"); 

foreach(string x in dict[1]) 
{ 
    Console.WriteLine(x); 
} 

uscita:

first 
second 
+0

Stai cercando di utilizzare specificamente un numero per la chiave? Se una stringa è sufficiente, il NameValueCollection potrebbe essere utile: è possibile assegnare più valori a una chiave. –

risposta

42

In .NET 3.5 è possibile utilizzare uno Lookup anziché un dizionario.

var items = new List<KeyValuePair<int, String>>(); 
items.Add(new KeyValuePair<int, String>(1, "first")); 
items.Add(new KeyValuePair<int, String>(1, "second")); 
var lookup = items.ToLookup(kvp => kvp.Key, kvp => kvp.Value); 

foreach (string x in lookup[1]) 
{ 
    Console.WriteLine(x); 
} 

La classe Lookup è immutabile. Se si desidera una versione mutabile è possibile utilizzare EditableLookup da MiscUtil.

+1

Dai documenti: * Non esiste un costruttore pubblico per creare una nuova istanza di una ricerca . Inoltre, gli oggetti Lookup sono immutabili, ovvero non è possibile aggiungere o rimuovere elementi o chiavi da un oggetto Lookup dopo che è stato creato. * – Douglas

+0

@Douglas: Grazie per il commento. Ho aggiornato la mia risposta per comprendere questo punto. –

9

lo consiglio a fare qualcosa di simile:

var dict = new Dictionary<int, HashSet<string>>(); 
dict.Add(1, new HashSet<string>() { "first", "second" }); 
6

Dictionary<T,K> non supporta tale comportamento e non c'è raccolta nella libreria di classi base che fornisce tale comportamento. Il modo più semplice è quello di costruire una struttura dati composita simili:

var data = new Dictionary<int, List<string>>(); 

Come secondo parametro è necessario utilizzare una raccolta che fornisce le qualità che cerchi, cioè ordine stabile ⇒ List<T>, accesso veloce HashSet<T>, etc.

1

Quello che stai cercando non è in realtà un dizionario nel senso tradizionale (vedi Associative Array).

Non c'è classe, per quanto io sappia, che offre questo nel quadro (System.Linq.Lookup non espone un costruttore), ma è possibile creare una classe che implementa te ILookup<TKey, TElement>

0

Si potrebbe forse usare un dizionario sulla chiave primaria, in cui ogni elemento è un elenco o altra raccolta sulla chiave secondaria. Per aggiungere un elemento alla struttura dati, vedere se esiste la chiave primaria. In caso contrario, creare un nuovo elenco di singoli elementi con il valore e memorizzarlo nel dizionario. Se la chiave primaria esiste, aggiungi il tuo Valore all'elenco che si trova nel dizionario.

2

Sicuramente si desidera utilizzare NameValueCollection:

utilizzando System.Collections.Specialized;

NameValueCollection nvc = new NameValueCollection(); 
nvc.Add("pets", "Dog"); 
nvc.Add("pets", "Rabbit"); 
Console.WriteLine(nvc["pets"]); 
//returns Dog,Rabbit 
+5

NVC funziona solo con le stringhe. – oillio

Problemi correlati