JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

OrderedDictionary vs Dictionary

Hoy, en el curso de preparación del examen 70-536, ha surgido la siguiente duda:

¿OrderedDictionary sólo se diferencia respecto a Dictionary, en qué se puede tener acceso además de por clave también por índice, o existe alguna otra diferencia mayor?

La verdad es que OrderedDictionary es un mal nombre para los programadores de habla hispana, porque hay la tendencia a pensar que ordena los elementos, cuando en realidad se refiere a que los guarda por el orden en que se han introducido con el método Add.  Un diccionario que ordene sus elementos es un SortedDictionary de tipo genérico.

Así, si escribimos un código similar a este:

using System;
using System.Collections;
using System.Collections.Specialized;

public class Prueba
{
	public static void Main()
	{
		OrderedDictionary od = new OrderedDictionary();
	    od.Add("05", "Cinco");
		od.Add("02", "Dos");
		od.Add("03", "Tres");
		od.Add("04", "Cuatro");
		od.Add("01", "Uno");
		
		Console.WriteLine("Iterar como si fuera una matriz");
	    for (int i = 0; i < od.Count; i++)
        {
          string s = (string) od[i];
          Console.WriteLine(s);
      }

	  Console.WriteLine("Iterar como si fuera un Diccionario");
      foreach(DictionaryEntry de in od)
      {
        Console.WriteLine(de.Value);
      }
		Console.ReadLine();
	}
}

En realidad lo que obtenemos por pantalla es la lista de elementos en el orden en el que fueron introducidos, no una lista ordenada por la clave o el valor, como podríamos pensar.

Aunque se apellida “Dictionary” no es igual que un diccionario puesto que, de hecho, almacena los datos de dos formas distintas, como un HashTable (para parecerse a un diccionario) y como un ArrayList para parecerse a una matriz. También mantiene dos formas de enumerar (una como pares de clave/valor y la otra como un enumerador normal para matrices, por posición).

Si usamos .NET Reflector para examinar su implementación se ve muy claramente.

En esta captura vemos destacados el HashTable y el ArrayList, los enumeradores, y la implementación del método Add que añade el elemento a ambas colecciones:

OrderedDictionary
Pulsa para agrandar

¡Espero que te resulte útil!

José Manuel Alarcón
Banner

Agregar comentario