Historia de la pregunta:
En VB.NET, la clase Dictionary(Of TKey, TValue) se ha convertido en el estándar destacado para el almacenamiento asociativo de datos (clave-valor). En el clásico VB6, se utilizaba más a menudo el objeto Scripting.Dictionary o la colección Collection, así como el tipo Hashtable, que apareció en las primeras versiones de .NET. Estas estructuras permiten encontrar valores rápidamente por clave y reemplazaron métodos menos seguros desde el punto de vista de tipos.
Problema
La diferencia menos obvia entre Dictionary y Hashtable —y los posibles errores al buscar con una clave ausente. Por ejemplo, intentar acceder a una clave inexistente genera un error en algunos casos y no en otros. Además, las diferencias en seguridad de tipos y rendimiento llevan a elecciones incorrectas de la colección.
Solución
En las versiones modernas de VB.NET, se considera una buena práctica usar Dictionary(Of TKey, TValue), donde TKey y TValue están estrictamente tipificados:
Dim dict As New Dictionary(Of String, Integer)() dict.Add("apple", 1) dict.Add("banana", 2) If dict.ContainsKey("banana") Then Console.WriteLine(dict("banana")) ' Mostrará 2 End If ' Obtención segura del valor Dim value As Integer If dict.TryGetValue("cherry", value) Then Console.WriteLine(value) Else Console.WriteLine("¡No hay tal clave!") End If
Características clave:
¿Se puede usar Object como clave sin restricciones en Dictionary?
Formalmente sí, pero se requiere una correcta implementación de los métodos GetHashCode y Equals en la clase que sirve como clave. De lo contrario, pueden ocurrir colisiones y errores de búsqueda.
¿Qué sucederá si se intenta acceder a una clave no existente a través de dict("foo")?
Se lanzará una excepción KeyNotFoundException. Sin una verificación previa de la clave (a través de ContainsKey o TryGetValue), el programa fallará.
¿Soportan Dictionary y Hashtable el mismo orden de los elementos?
No. Ambos clases no garantizan el orden de adición de los elementos. Para mantener el orden, use SortedDictionary, OrderedDictionary u otras estructuras.
Un desarrollador eligió Hashtable para almacenar grandes volúmenes de datos de usuarios. Se presentaban errores difíciles de rastrear: la misma clave no coincidía siempre, aparecían errores Object.ReferenceEquals en las pruebas, se hacía referencia a un tipo de clave inestable.
Pros:
Contras:
Pasaron a Dictionary(Of Guid, User): tipado estricto, soporte para TryGetValue, eliminaron errores de colisión. La eficiencia aumentó.
Pros:
Contras: