“C# – Koleksiyonlar” başlıklı yazımızda koleksiyonların avantajlarından, dezavantajlarından bahsedip, genel bir bilgi vermiştik. Bu yazımızda ise bir koleksiyon sınıfı olan SortedList‘den bahsedeceğiz.
SortedList Sınıfının Temel Yapısı
Standart dizilere eklenen elemanlar, belleğe sıralı bir şekilde yerleştirilmektedir. Sıfırdan başlayarak her bir elemana birer indeks değeri verip, elemanlara o indeksler aracılığıyla erişe bilmekteydik.
SortedList koleksiyonunda ise Anahtar(Key) ve Değer(Value) olmak üzere iki kavram karşımıza çıkmakta. Konuyu daha anlaşılır kılmak açısından; standart dizilere eklediğimiz elemanları Değer, o elemanlara erişmek için kullandığımız indeksleri de Anahtar olarak düşünebilirsiniz.
Her bir Değerin farklı bir Anahtarı olmalıdır yani koleksiyon içerisinde yer alan Anahtarlar birbirinden farklı olmalıdır. Şimdi, başlangıç seviyesinde basit bir C# konsol uygulaması hazırlayarak SortedList Sınıfını incelemeye devam edelim.
SortedList SiraliKoleksiyon = new SortedList(); // SiraliKoleksiyon.Add(Eklenecek_Anahtar,Eklenecek_Değer); SiraliKoleksiyon.Add(41, "Kocaeli"); SiraliKoleksiyon.Add(54, "Sakarya"); SiraliKoleksiyon.Add(25, "Erzurum"); ICollection Anahtarlar = SiraliKoleksiyon.Keys; foreach (var Anahtar in Anahtarlar) Console.WriteLine("Anahtar:{0} - Değer:{1}", Anahtar, SiraliKoleksiyon[Anahtar]);
Yukarıdaki örneğimizi açıklayacak olursak; Anahtar(Key) olarak plaka kodunu, Değer(Value) olarak da ilgili şehri tuttuğumuz bir koleksiyon oluşturduk. Keys özelliği ile koleksiyonumuzda yer alan tüm anahtarların listesini alıp, foreach döngüsüyle tüm Anahtar-Değer çiftlerini ekrana yazdırdık.
Öğeleri Sıralı Bir Şekilde Tutmakta
SortedList, Anahtarların değerlerine bağlı olarak Anahtar-Değer çiftlerini sıralı olarak saklayan bir koleksiyon oluşturmaktadır. Sıralama işlemini ikili arama ağacı kullanarak yapmaktadır. Yukarıdaki örneğimiz de Anahtar-Değer çiftleri ekrana, Anahtar(Key) değerlerine göre sıralı bir şekilde yazılacaktır.
- • Anahtar: 25 – Değer: Erzurum
- • Anahtar: 41 – Değer: Kocaeli
- • Anahtar: 54 – Değer: Sakarya
Küçük Veri Kümeleri Üzerinde Daha Etkili
Değinilmesi gereken bir diğer hususta; SortedList küçük veri kümeleri üzerinde iyi bir performans sergilerken, yüksek boyutlardaki veri kümelerinde daha düşük performans sergilemektedir. Eğer büyük bir veri kümesine sahipseniz SortedList yerine Dictionary sınıfını kullanabilirsiniz. SortedList, Dictionary’den daha kötü bir arama performansına sahiptir.
Metotlar ve Özellikler
- Nesne Oluşturma
SortedList sınıfından bir nesne oluşturuyoruz. Bu nesne, koleksiyondaki nesnelerin referanslarını tutacaktır. Ayrıca koleksiyon içerisinde tutulacak Anahtar ve Değerin veri tipini önceden biliyorsak tıpkı Dictionary sınıfında yapmış olduğumuz gibi bir nesne oluşturabiliriz.SortedList SiraliKoleksiyon = new SortedList(); // Dictionary sınıfında yapmış olduğumuz gibi bir nesne oluşturabiliriz. SortedList<int, string> SiraliKoleksiyon = new SortedList<int, string>();
- Add(Eklenecek_Anahtar, Eklenecek_Deger) Metodu
Add() metodu ile koleksiyon içerisine Anahtar-Değer çiftlerini eklemekteyiz.SiraliKoleksiyon.Add(06, "Ankara");
- ContainsKey(Aranan_Anahtar) Metodu
Koleksiyon içerisinde, parametre olarak girilen değerde bir Anahtar (Key) mevcutsa TRUE değilse FALSE döndürecektir.SortedList SiraliKoleksiyon = new SortedList(); SiraliKoleksiyon.Add(41, "Kocaeli"); SiraliKoleksiyon.Add(54, "Sakarya"); SiraliKoleksiyon.Add(25, "Erzurum"); // Koleksiyonda "41" Anahtarı mevcut olduğu için TRUE döndürecektir. // Ekran çıktısı: Kocaeli if (SiraliKoleksiyon.ContainsKey(41)) Console.WriteLine(SiraliKoleksiyon[41]); else Console.WriteLine("Anahtar Mevcut Değil.");
- ContainsValue(Aranan_Deger) Metodu
Koleksiyon içerisinde, parametre olarak girilen ifadede bir Değer(Value) mevcutsa TRUE değilse FALSE döndürecektir.SortedList SiraliKoleksiyon = new SortedList(); SiraliKoleksiyon.Add(41, "Kocaeli"); SiraliKoleksiyon.Add(54, "Sakarya"); SiraliKoleksiyon.Add(25, "Erzurum"); // Koleksiyonda "Sakarya" Değeri mevcut olduğu için TRUE döndürecektir. // Ekran çıktısı: Mevcut if (SiraliKoleksiyon.ContainsValue("Sakarya")) Console.WriteLine("Mevcut."); else Console.WriteLine("Mevcut Değil.");
- Clear() Metodu
Koleksiyon içerisinde yer alan tüm Anahtar-Değer çiftlerini silmektedir.SiraliKoleksiyon.Clear();
- Remove(Anahtar) Metodu
Koleksiyon içerisinde, parametre olarak girilen değerde bir Anahtar(Key) mevcutsa; Anahtarı ve anahtarla ilişkili Değeri silecektir.SiraliKoleksiyon.Remove(41);
- GetKeyList() Metodu ve Keys Özelliği
Her ikisi de Anahtarları(Keys) içeren bir koleksiyon döndürmektedir.SortedList SiraliKoleksiyon = new SortedList(); SiraliKoleksiyon.Add(41, "Kocaeli"); SiraliKoleksiyon.Add(54, "Sakarya"); SiraliKoleksiyon.Add(25, "Erzurum"); IList Anahtarlar = SiraliKoleksiyon.GetKeyList(); // ICollection Anahtarlar = SiraliKoleksiyon.Keys; foreach (var Anahtar in Anahtarlar) Console.WriteLine(Anahtar);
- GetValueList() Metodu ve Values Özelliği
Her ikisi de Değerleri(Values) içeren bir koleksiyon döndürmektedir.SortedList SiraliKoleksiyon = new SortedList(); SiraliKoleksiyon.Add(41, "Kocaeli"); SiraliKoleksiyon.Add(54, "Sakarya"); SiraliKoleksiyon.Add(25, "Erzurum"); IList Degerler = SiraliKoleksiyon.GetValueList(); // ICollection Degerler = SiraliKoleksiyon.Values; foreach (var Deger in Degerler) Console.WriteLine(Deger);
- Count Özelliği
Koleksiyon içerisinde bulunan anahtar-değer çiftlerinin sayısını döndürmektedir.int ElemanSayisi = SiraliKoleksiyon.Count
- GetByIndex(indeks) ve GetKey(indeks) Metotları
SortedList’de Değerlere, Anahtar ile erişebildiğimiz gibi indeks ile de erişebiliriz. GetByIndex() Metodu parametre olarak girilen indeksteki Değeri döndürür. GetKey(indeks) metodu ise parametre olarak girilen indeksteki Anahtarı döndürür.SortedList SiraliKoleksiyon = new SortedList(); SiraliKoleksiyon.Add(41, "Kocaeli"); SiraliKoleksiyon.Add(54, "Sakarya"); SiraliKoleksiyon.Add(25, "Erzurum"); for (int i = 0; i < SiraliKoleksiyon.Count; i++) Console.WriteLine("Anahtar:{0} - Değer:{1}",SiraliKoleksiyon.GetKey(i),SiraliKoleksiyon.GetByIndex(i));
- IndexOfKey(Anahtar) ve IndexOfValue(Değer) Metotları
IndexOfKey() metodu parametre olarak girilen Anahtarın indeksini döndürür. IndexOfValue() metodu ise parametre olarak girilen Değerin indeksini döndürür. Parametre olarak girilen Anahtar veya Değer koleksiyonda mevcut değilse -1 döndürürler.SortedList SiraliKoleksiyon = new SortedList(); SiraliKoleksiyon.Add(41, "Kocaeli"); SiraliKoleksiyon.Add(54, "Sakarya"); SiraliKoleksiyon.Add(25, "Erzurum"); IList Anahtarlar = SiraliKoleksiyon.GetKeyList(); IList Degerler = SiraliKoleksiyon.GetValueList(); // Her bir Anahtar ve Anahtarın indeksi ekrana yazdırıldı. foreach(var Anahtar in Anahtarlar) Console.WriteLine("Anahtar:{0} - İndeks:{1}", Anahtar, SiraliKoleksiyon.IndexOfKey(Anahtar)); // Her bir Değer ve Değerin indeksi ekrana yazdırıldı. foreach(var Deger in Degerler) Console.WriteLine("Deger:{0} - İndeks:{1}", Deger, SiraliKoleksiyon.IndexOfValue(Deger));
- SetByIndex(i, val) Metodu
i. indeksteki Değere “val” değişkeninin değerini atar.SortedList SiraliKoleksiyon = new SortedList(); SiraliKoleksiyon.Add(25, "Erzurum"); SiraliKoleksiyon.Add(41, "Kocaeli"); SiraliKoleksiyon.Add(54, "Sakarya"); // 1. indekste bulunan "Kocaeli" Değeri "İzmit" olarak değiştirildi. var YeniDeger = "İzmit"; SiraliKoleksiyon.SetByIndex(1, YeniDeger);
- DictionaryEntry yapısı
Hastable sınıfında olduğu gibi SortedList sınıfında da Anahtar-Değer çiftlerini bir DictionaryEntry yapısında tutabiliriz.SortedList SiraliKoleksiyon = new SortedList(); SiraliKoleksiyon.Add(25, "Erzurum"); SiraliKoleksiyon.Add(41, "Kocaeli"); SiraliKoleksiyon.Add(54, "Sakarya"); foreach (DictionaryEntry oge in SiraliKoleksiyon) Console.WriteLine("Anahtar:{0} - Değer:{1}", oge.Key, oge.Value);
Serdar Yılmaz
Eline sağlık.Bütün ödevi senden çektim her yorum bir beğeni eyvallah hocam 🙂