c# dictionary ordereddictionary

c# - OrderedDictionary y Dictionary



(1)

Estaba buscando una manera de que mi Dictionary enumere su KeyValuePair en el mismo orden en que se agregaron. Ahora, el documento del diccionario dice claramente que:

A los efectos de la enumeración, cada elemento del diccionario se trata como una KeyValuePair<TKey, TValue> que representa un valor y su clave. El orden en que se devuelven los artículos no está definido.

Descubrí que lo que necesitaba era un documento OrderedDictionary , pero al ser el escéptico que soy, decidí probarlo yo mismo:

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

Salida:

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

Como puede ver, ambos están ordenados, y eso plantea 2 preguntas:
¿En qué caso el Dictionary da un orden diferente al que se agregan los valores? ¿Mi primer bucle foreach me asegura que recuperaré mi KeyValuePair en el mismo orden, o tengo que usar el índice?


Lo estas haciendo mal. No solo tiene que insertar valores secuencialmente en el diccionario, sino también eliminar algunos elementos y ver cómo ha cambiado el orden después de esto. El siguiente código demuestra esto:

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

imprime algo similar a (OrderedDictionary siempre se ordena):

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