Historia pytania:
Kolekcje typu SortedList i SortedDictionary pojawiły się w .NET dla wygodnego przechowywania par klucz-wartość w posortowanym według klucza formacie. Są używane, gdy ważny jest szybki dostęp po kluczu przy jednoczesnym wsparciu sortowania.
Problem:
Częste błędy związane są z niewłaściwym wyborem między tymi kolekcjami, używaniem kluczy niewłaściwego typu (bez wsparcia IComparable), a także błędnymi oczekiwaniami co do zachowania przy wstawianiu duplikujących się kluczy.
Rozwiązanie:
W Visual Basic używane są klasy SortedList(Of TKey, TValue) i SortedDictionary(Of TKey, TValue) do przechowywania posortowanych danych.
Przykład kodu:
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
Kluczowe cechy:
1. Czy można zmieniać klucze istniejących elementów w SortedList lub SortedDictionary?
Nie, nie można zmienić klucza istniejącego elementu. Aby "zmienić" klucz, należy usunąć oryginalną parę i dodać nową z poprawionym kluczem.
2. Jaki wyjątek występuje przy próbie dodania już istniejącego klucza?
Wyrzucany jest ArgumentException.
Dim sl As New SortedList(Of Integer, String)() sl.Add(1, "One") sl.Add(1, "Repeat") ' ArgumentException
3. Co się stanie, jeśli w kluczach używać typu, który nie implementuje IComparable?
Kompilator pozwoli stworzyć kolekcję, ale przy próbie dodania pierwszego elementu zgłoszony zostanie InvalidOperationException.
Class MyObj End Class Dim sd As New SortedDictionary(Of MyObj, String)() sd.Add(New MyObj(), "test") ' Exception
Zrealizowano rejestr użytkowników według identyfikatora (userId - klucz) i wieku (wartość) na SortedList. Kluczem wybrano swój typ obiektu (User), który nie implementuje IComparable. Przy dodawaniu użytkowników występują nieoczekiwane wyjątki.
Zalety:
Wady:
Używają SortedDictionary(Of Integer, User), gdzie klucz - prosty typ Integer (userId), który wspiera porównanie. Wszystko działa poprawnie, sortowanie według identyfikatora użytkowników jest obecne.
Zalety:
Wady: