Sorunun Tarihi:
SortedList ve SortedDictionary türündeki koleksiyonlar, anahtar-değer çiftlerini anahtara göre sıralanmış bir biçimde kolayca depolamak için .NET'te ortaya çıkmıştır. Anahtara hızlı erişimin önemli olduğu ve aynı zamanda sıralamanın desteklenmesi gerektiğinde kullanılırlar.
Sorun:
Bu koleksiyonlar arasında yanlış seçim, uygun türde anahtarlar kullanmama (IComparable desteği olmadan) ve yinelemeli anahtarlar eklerken beklenen davranışın yanlış anlaşılması gibi sık karşılaşılan hatalar vardır.
Çözüm:
Visual Basic'te sıralı verileri depolamak için SortedList(Of TKey, TValue) ve SortedDictionary(Of TKey, TValue) sınıfları kullanılır.
Kod örneği:
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, "Üç") sortedDict.Add(1, "Bir") For Each pair In sortedDict Console.WriteLine(pair.Key & ": " & pair.Value) Next
Anahtar özellikler:
1. SortedList veya SortedDictionary'deki mevcut öğelerin anahtarlarını değiştirmek mümkün mü?
Hayır, mevcut bir öğenin anahtarını değiştirmek mümkün değildir. "Anahtarı değiştirmek" için, mevcut çifti silmek ve yeni düzeltilmiş anahtar ile eklemek gerekir.
2. Zaten var olan bir anahtar eklemeye çalışıldığında hangi istisna ortaya çıkar?
ArgumentException fırlatılır.
Dim sl As New SortedList(Of Integer, String)() sl.Add(1, "Bir") sl.Add(1, "Tekrar") ' ArgumentException
3. Anahtarlarda IComparable'ı uygulamayan bir tür kullanılırsa ne olur?
Derleyici koleksiyonu oluşturmanıza izin verir, ancak ilk öğeyi eklemeye çalıştığınızda InvalidOperationException fırlatılır.
Class MyObj End Class Dim sd As New SortedDictionary(Of MyObj, String)() sd.Add(New MyObj(), "test") ' İstisna
Kullanıcıların kullanıcı kimliğine (userId — anahtar) ve yaşına (değer) göre bir kaydı SortedList ile gerçekleştirdiler. Anahtar için kendi nesne türlerini (User) seçtiler, bu tür IComparable'ı uygulamıyor. Kullanıcılar eklenirken beklenmeyen istisnalar ortaya çıkıyor.
Artılar:
Eksiler:
SortedDictionary(Of Integer, User) kullanılıyor, burada anahtar — karşılaştırma desteği olan basit bir Integer (userId) türüdür. Her şey doğru şekilde çalışıyor, kullanıcı kimliklerine göre sıralama mevcut.
Artılar:
Eksiler: