Storia della domanda:
Le collezioni di tipo SortedList e SortedDictionary sono apparse in .NET per facilitare la memorizzazione di coppie chiave-valore ordinate per chiave. Vengono utilizzate quando è importante un accesso rapido per chiave con supporto simultaneo per l'ordinamento.
Problema:
Gli errori frequenti sono legati alla scelta errata tra queste collezioni, all'uso di chiavi di tipo inadeguato (senza supporto per IComparable), così come a aspettative errate sul comportamento durante l'inserimento di chiavi duplicate.
Soluzione:
In Visual Basic si usano le classi SortedList(Of TKey, TValue) e SortedDictionary(Of TKey, TValue) per memorizzare dati ordinati.
Esempio di codice:
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
Caratteristiche chiave:
1. È possibile modificare le chiavi degli elementi esistenti in SortedList o SortedDictionary?
No, non è possibile modificare la chiave di un elemento esistente. Per "modificare" una chiave, è necessario rimuovere la coppia originale e aggiungere una nuova con la chiave corretta.
2. Quale eccezione si verifica quando si tenta di aggiungere una chiave già esistente?
Viene sollevata un'ArgumentException.
Dim sl As New SortedList(Of Integer, String)() sl.Add(1, "One") sl.Add(1, "Repeat") ' ArgumentException
3. Cosa succede se nei tasti si usa un tipo che non implementa IComparable?
Il compilatore permetterà di creare la collezione, ma nel tentativo di aggiungere il primo elemento verrà sollevata un'InvalidOperationException.
Class MyObj End Class Dim sd As New SortedDictionary(Of MyObj, String)() sd.Add(New MyObj(), "test") ' Exception
Realizzato un registro utenti per identificativo (userId - chiave) e età (valore) su SortedList. Come chiave è stato scelto un proprio tipo di oggetto (User) che non implementa IComparable. Durante l'aggiunta di utenti si verificano eccezioni inaspettate.
Vantaggi:
Svantaggi:
Si utilizza SortedDictionary(Of Integer, User), dove la chiave è un tipo semplice Integer (userId), che supporta il confronto. Funziona tutto correttamente, con ordinamento per identificativo degli utenti.
Vantaggi:
Svantaggi: