ProgramlamaVB.NET programcısı (veritabanları, iş mantığı)

Visual Basic'de SortedList ve SortedDictionary koleksiyonlarıyla çalışma mekanizmalarını anlatın. Bu koleksiyonların farkı nedir, spesifikaları nelerdir, anahtar ve değer kullanırken nelere dikkat etmek gerekir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Anahtara göre sıralama, anahtar türü IComparable'ı desteklemeli veya koleksiyon oluşturulurken IComparer verilmelidir.
  • SortedList, küçük hacimlerde daha az bellek kullanır, ancak sık ekleme/silme işlemlerinde SortedDictionary'den daha az etkilidir.
  • Tekrar eden anahtarlar yoktur — mevcut bir anahtar eklemeye çalışırken bir istisna fırlatılır.

Kandırıcı Sorular.

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

Tipik Hatalar ve Anti-Desenler

  • Mevcut öğelerin anahtarlarını değiştirmeye çalışma (mümkün değil).
  • Anahtar olarak IComparable/IComparer uygulamayan nesneleri ekleme.
  • Tekrar eden bir anahtar eklerken işlenmemiş istisna.

Gerçek Hayattan Örnek

Olumsuz Durum

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:

  • Sıralama işe yarayabilirdi, her şey yolunda gitseydi.

Eksiler:

  • Eklemeye çalışırken program çöküyor.
  • Kullanıcı, User sınıfını yeniden geliştirmeden bir şey yapamaz.

Olumlu Durum

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:

  • Hızlı sıralama ve arama.
  • IComparable ile ilgili hataların ortadan kaldırılması.

Eksiler:

  • Sık silme/ekleme işlemleri için SortedDictionary, SortedList'ten biraz daha fazla bellek tüketiyor (SortedList, büyük hacimlerde daha yavaş ekleme yapar).