Uso de TDictionary para tablas de hash en Delphi

Introducido en Delphi 2009, el TDictionary clase, definido en la unidad Generics.Collections, representa una colección genérica de tipos de tabla hash de pares clave-valor.

Los tipos genéricos, también introducidos en Delphi 2009, le permiten definir clases que no definen específicamente el tipo de miembros de datos.

Un diccionario es, en cierto modo, similar a una matriz. En una matriz, trabaja con una serie (colección) de valores indexados por un valor entero, que puede ser cualquier valor de tipo ordinal. Este índice tiene un límite inferior y superior..

En un diccionario, puede almacenar claves y valores donde cualquiera puede ser de cualquier tipo.

El constructor TDictionary

De ahí la declaración del constructor TDictionary:

En Delphi, el TDictionary se define como una tabla hash. Las tablas hash representan una colección de pares clave-valor que se organizan en función del código hash de la clave. Las tablas hash están optimizadas para búsquedas (velocidad). Cuando se agrega un par clave-valor a una tabla hash, el hash de la clave se calcula y almacena junto con el par agregado.

TKey y TValue, porque son genéricos, pueden ser de cualquier tipo. Por ejemplo, si la información que debe almacenar en el diccionario proviene de alguna base de datos, su clave puede ser un valor GUID (o algún otro valor que presente el índice único) mientras que el valor puede ser un objeto asignado a una fila de datos en las tablas de tu base de datos.

Usando TDictionary

En aras de la simplicidad, el siguiente ejemplo usa números enteros para TKeys y caracteres para TValues. 

Primero, declaramos nuestro diccionario especificando cuáles serán los tipos de TKey y TValue:

Luego, el diccionario se llena con el método Agregar. Debido a que un diccionario no puede tener dos pares con el mismo valor clave, puede usar el método ContainsKey para verificar si algún par clave-valor ya está dentro del diccionario.

Para eliminar un par del diccionario, use el método Eliminar. Este método no causará problemas si un par con una clave especificada no forma parte del diccionario..

Para recorrer todos los pares recorriendo las teclas, puede hacer un bucle for.

Use el método TryGetValue para verificar si algún par clave-valor está incluido en el diccionario.

Ordenar el diccionario

Debido a que un diccionario es una tabla hash, no almacena elementos en un orden de clasificación definido. Para recorrer las claves ordenadas para satisfacer sus necesidades específicas, aproveche el TList, un tipo de colección genérico que admite la clasificación.

El código anterior ordena las teclas de forma ascendente y descendente y toma los valores como si estuvieran almacenados en el orden ordenado en el diccionario. La clasificación descendente de los valores clave de tipo entero utiliza TComparer y un método anónimo.