I was looking for a way to have my Dictionary
enumerate its KeyValuePair
in the same order that they were added. Now, Dictionary's documentation clearly states that:
For purposes of enumeration, each item in the dictionary is treated as a
KeyValuePair<TKey, TValue>
structure representing a value and its key. The order in which the items are returned is undefined.
I found out that what I needed was an OrderedDictionary
, but being the sceptic that I am, I decided to try it myself:
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);
}
Output:
OrderedDictionary
key0, value0
key1, value1
key2, value2
...
Dictionary
key0, value0
key1, value1
key2, value2
...
As you can see, both are ordered, and that raise two questions:
In which case does the Dictionary
give a different order that the one in which the values are added?
Does my first foreach
loop assure me to retrieve my KeyValuePair
in the same order, or do I have to use the index?
You are doing it wrong. You need not only to insert values sequentially into dictionary, but also remove some elements and see how the order has changed after this. The next code demonstrates this:
prints something similar to (OrderedDictionary is always ordered):