Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OrderedDictionary and Dictionary

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?

like image 987
DeadlyJesus Avatar asked May 22 '13 14:05

DeadlyJesus


People also ask

Is there an ordered dictionary in C#?

OrderedDictionary Class represents a collection of key/value pairs that are accessible by the key or index. It is present in System. Collections.

Does dictionary maintain order python?

Since dictionaries in Python 3.5 don't remember the order of their items, you don't know the order in the resulting ordered dictionary until the object is created. From this point on, the order is maintained. Since Python 3.6, functions retain the order of keyword arguments passed in a call.

Is ordered dictionary thread safe?

Explicit Interface Implementations Gets a value indicating whether access to the OrderedDictionary object is synchronized (thread-safe).

Is Swift dictionary ordered?

There is no order. Dictionaries in Swift are an unordered collection type. The order in which the values will be returned cannot be determined. If you need an ordered collection of values, I recommend using an array.


1 Answers

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:

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

prints something similar to (OrderedDictionary is always ordered):

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 
like image 103
Ilya Ivanov Avatar answered Sep 18 '22 02:09

Ilya Ivanov