Contexte de la question :
Les collections de type SortedList et SortedDictionary ont été introduites dans .NET pour stocker de manière pratique des paires clé-valeur dans un ordre trié par clé. Elles sont utilisées lorsque l'accès rapide par clé est important tout en maintenant le tri.
Problème :
Les erreurs courantes sont liées à un mauvais choix entre ces collections, à l'utilisation de clés de types inappropriés (sans support pour IComparable), ainsi qu'à des attentes incorrectes concernant le comportement lors de l'insertion de clés en double.
Solution :
En Visual Basic, on utilise les classes SortedList(Of TKey, TValue) et SortedDictionary(Of TKey, TValue) pour stocker des données triées.
Exemple de code :
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, "Trois") sortedDict.Add(1, "Un") For Each pair In sortedDict Console.WriteLine(pair.Key & ": " & pair.Value) Next
Caractéristiques principales :
1. Peut-on modifier les clés des éléments existants dans SortedList ou SortedDictionary ?
Non, il n'est pas possible de modifier la clé d'un élément existant. Pour "modifier" une clé, il faut supprimer la paire d'origine et en ajouter une nouvelle avec la clé ajustée.
2. Quelle exception se produit lors de la tentative d'ajout d'une clé déjà existante ?
Une ArgumentException est levée.
Dim sl As New SortedList(Of Integer, String)() sl.Add(1, "Un") sl.Add(1, "Répéter") ' ArgumentException
3. Que se passe-t-il si des types non implémentant IComparable sont utilisés comme clés ?
Le compilateur permettra de créer la collection, mais lors de la première tentative d'ajout d'un élément, InvalidOperationException sera levée.
Class MyObj End Class Dim sd As New SortedDictionary(Of MyObj, String)() sd.Add(New MyObj(), "test") ' Exception
Un registre d'utilisateurs a été implémenté par identifiant (userId — clé) et par âge (valeur) dans SortedList. La clé choisie était de mon type d'objet (User), qui n'implémente pas IComparable. Des exceptions inattendues surviennent lors de l'ajout d'utilisateurs.
Avantages :
Inconvénients :
Utilisation de SortedDictionary(Of Integer, User), où la clé est un type simple Integer (userId), qui supporte la comparaison. Tout fonctionne correctement, avec tri des identifiants des utilisateurs.
Avantages :
Inconvénients :