ProgrammationDéveloppeur VB.NET (bases de données, logique métier)

Parlez-nous des mécanismes de travail avec les collections SortedList et SortedDictionary en Visual Basic. Quelle est la différence entre ces collections, quelle est leur spécificité, et à quoi faire attention lors de l'utilisation des clés et des valeurs ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Tri par clé, le type de clé doit supporter IComparable ou être défini par IComparer lors de la création de la collection.
  • SortedList est plus économique en mémoire pour de petits volumes, mais moins efficace lors d'opérations fréquentes d'insertion/suppression, par rapport à SortedDictionary.
  • Les doublons de clés ne sont pas autorisés — une exception est levée en cas de tentative d'ajout d'une clé déjà existante.

Questions pièges.

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

Erreurs typiques et anti-modèles

  • Tentative de modification des clés des éléments existants (impossible).
  • Ajout d'objets comme clés sans implémenter IComparable/IComparer.
  • Exception non gérée lors de l'ajout d'une clé répétée.

Exemple de la vie réelle

Cas négatif

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 :

  • Le tri serait pratique si tout fonctionnait.

Inconvénients :

  • Le programme plante lors de l'insertion.
  • L'utilisateur ne peut rien faire sans modifier la classe User.

Cas positif

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 :

  • Tri et recherche rapides.
  • Élimination des erreurs liées à IComparable.

Inconvénients :

  • Pour des suppressions/ajouts fréquents, SortedDictionary consomme un peu plus de mémoire que SortedList (insertion plus lente dans de gros volumes pour SortedList).