Historia del tema:
Las colecciones de tipo SortedList y SortedDictionary aparecieron en .NET para facilitar el almacenamiento de pares clave-valor en un formato ordenado por clave. Se utilizan cuando es importante el acceso rápido por clave, junto con el soporte de la clasificación.
Problema:
Los errores comunes están relacionados con la elección incorrecta entre estas colecciones, el uso de claves de tipo inapropiado (sin soporte para IComparable), así como expectativas incorrectas sobre el comportamiento al insertar claves duplicadas.
Solución:
En Visual Basic, se utilizan las clases SortedList(Of TKey, TValue) y SortedDictionary(Of TKey, TValue) para almacenar datos ordenados.
Ejemplo de código:
Dim sortedList As New SortedList(Of String, Integer)() sortedList.Add("Alex", 27) sortedList.Add("Mike", 34) Dim age As Integer = sortedList("Alex") ' 27 Dim sortedDict As New SortedDictionary(Of Integer, String)() sortedDict.Add(3, "Three") sortedDict.Add(1, "One") For Each pair In sortedDict Console.WriteLine(pair.Key & ": " & pair.Value) Next
Características clave:
1. ¿Se pueden cambiar las claves de los elementos existentes en SortedList o SortedDictionary?
No, no se puede cambiar la clave de un elemento existente. Para "cambiar" la clave, se debe eliminar el par original y agregar uno nuevo con la clave corregida.
2. ¿Qué excepción se lanza al intentar agregar una clave ya existente?
Se lanza ArgumentException.
Dim sl As New SortedList(Of Integer, String)() sl.Add(1, "One") sl.Add(1, "Repeat") ' ArgumentException
3. ¿Qué sucede si se usan tipos en las claves que no implementan IComparable?
El compilador permitirá crear la colección, pero al intentar agregar el primer elemento se lanzará InvalidOperationException.
Class MyObj End Class Dim sd As New SortedDictionary(Of MyObj, String)() sd.Add(New MyObj(), "test") ' Exception
Se implementó un registro de usuarios por identificador (userId - clave) y edad (valor) en SortedList. Se eligió su propio tipo de objeto (User), que no implementa IComparable. Al agregar usuarios, surgen excepciones inesperadas.
Pros:
Contras:
Se utiliza SortedDictionary(Of Integer, User), donde la clave es un tipo simple Integer (userId), que soporta comparación. Todo funciona correctamente, la clasificación por identificador de usuarios existe.
Pros:
Contras: