2013-05-22 13 views
38

Stavo cercando un modo per avere il mio Dictionary enumerare il suo KeyValuePair nello stesso ordine in cui sono stati aggiunti. Ora, Dictionary's doc affermare chiaramente che:OrderedDictionary and Dictionary

Ai fini del conteggio, ogni voce del dizionario è trattata come una struttura KeyValuePair<TKey, TValue> che rappresenta un valore e la sua chiave. L'ordine in cui vengono restituiti gli articoli non è definito.

ho scoperto che quello che mi serviva era un OrderedDictionary, ma essendo lo scettico che io sono, ho deciso di provare io stesso:

OrderedDictionary od = new OrderedDictionary(); 
Dictionary<String, String> d = new Dictionary<String, String>(); 

for (int i = 0; i < 10; i++) 
{ 
    od.Add("key"+i,"value"+i); 
    d.Add("key"+i,"value"+i); 
} 

System.Console.WriteLine("OrderedDictionary"); 
foreach (DictionaryEntry de in od) { 
    System.Console.WriteLine(de.Key +", " +de.Value); 
} 

System.Console.WriteLine("Dictionary"); 
foreach (var tmp in d) { 
    System.Console.WriteLine(tmp.Key +", " + tmp.Value); 
} 

uscita:

OrderedDictionary 
key0, value0 
key1, value1 
key2, value2 
... 

Dictionary 
key0, value0 
key1, value1 
key2, value2 
... 

Come si può vedere, entrambi sono ordinati e questo solleva 2 domande:
In tal caso il dà un ordine diverso da quello in cui vengono aggiunti i valori? Il mio primo ciclo foreach mi assicura di recuperare il mio KeyValuePair nello stesso ordine o devo usare l'indice?

+0

Provare a usare * * tasti a caso, mentre 'Add'ing alle collezioni e vedere la differenza. – I4V

+0

Solo per informazioni: @ I4V Provato, e questo non cambia. – DeadlyJesus

risposta

44

Stai sbagliando. Non è necessario solo inserire i valori sequenzialmente nel dizionario, ma anche rimuovere alcuni elementi e vedere come l'ordine è cambiato dopo questo. codice successivo lo dimostra:

OrderedDictionary od = new OrderedDictionary(); 
Dictionary<String, String> d = new Dictionary<String, String>(); 
Random r = new Random(); 

for (int i = 0; i < 10; i++) 
{ 
    od.Add("key"+i,"value"+i); 
    d.Add("key"+i,"value"+i); 
    if(i % 3 == 0) 
    { 
     od.Remove("key"+r.Next(d.Count)); 
     d.Remove("key"+r.Next(d.Count)); 
    } 
} 

System.Console.WriteLine("OrderedDictionary"); 
foreach (DictionaryEntry de in od) { 
    System.Console.WriteLine(de.Key +", " +de.Value); 
} 

System.Console.WriteLine("Dictionary"); 
foreach (var tmp in d) { 
    System.Console.WriteLine(tmp.Key +", " + tmp.Value); 
} 

stampe qualcosa di simile a (OrderedDictionary è sempre ordinata):

OrderedDictionary 
key3, value3 
key5, value5 
key6, value6 
key7, value7 
key8, value8 
key9, value9 
Dictionary 
key7, value7 
key4, value4 
key3, value3 
key5, value5 
key6, value6 
key8, value8 
key9, value9 
+0

E se solo enumerassi il dizionario? Da quello che ho capito funzionano allo stesso modo in quel caso. – DeadlyJesus

+0

@DeadlyJesus con enumerazione intendi l'inserimento di valori senza rimuovere? –

+0

Sì. Quello che ho fatto nel mio esempio è più o meno quello che sto facendo nella mia app, aggiungo solo valori nel dizionario e non li rimuoverò/modificherò in seguito. – DeadlyJesus