2013-05-22 7 views
38

Ich war auf der Suche nach einer Möglichkeit, meine Dictionary seine KeyValuePair in der gleichen Reihenfolge, die sie hinzugefügt wurden, aufzuzählen. Nun Dictionary's doc klar sagen, dass:OrderedDictionary und Dictionary

Für die Zwecke der Aufzählung, jedes Element in dem Wörterbuch als KeyValuePair<TKey, TValue> Struktur behandelt wird, einen Wert und seine Schlüssel darstellt. Die Reihenfolge, in der die Elemente zurückgegeben werden, ist nicht definiert.

fand ich heraus, dass das, was ich brauchte, war ein OrderedDictionary, aber die Skeptiker, dass ich bin, habe ich beschlossen, es selbst zu versuchen:

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); 
} 

Ausgang:

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

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

Wie Sie kann sehen, beide sind bestellt, und das wirft 2 Fragen auf:
In welchem ​​Fall gibt die Dictionary eine andere Reihenfolge, die die, in denen die Werte hinzugefügt werden? Versichert meine erste foreach Schleife, dass ich meine KeyValuePair in der gleichen Reihenfolge abrufen kann, oder muss ich den Index verwenden?

+0

Versuchen zu verwenden * random * Tasten während 'Add'ing zu den Sammlungen und den Unterschied sehen. – I4V

+0

Nur zur Information: @ I4V Versucht es, und das ändert sich nicht. – DeadlyJesus

Antwort

44

Sie tun es falsch. Sie müssen nicht nur Werte sequenziell in das Wörterbuch einfügen, sondern auch einige Elemente entfernen und sehen, wie sich die Reihenfolge danach geändert hat. Weiter Code demonstriert dies:

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); 
} 

druckt etwas ähnliches (OrderedDictionary immer bestellen):

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

Was passiert, wenn ich nur das Wörterbuch aufzähle? Von dem, was ich verstehe, funktionieren sie in diesem Fall genauso. – DeadlyJesus

+0

@DeadlyJesus durch Aufzählung bedeuten Sie Werte einfügen, ohne zu entfernen? –

+0

Ja. Was ich in meinem Beispiel getan habe, ist mehr oder weniger das, was ich in meiner App mache, ich füge nur Werte in das Wörterbuch ein und entferne/ändere sie danach nie. – DeadlyJesus