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