YÜKLENİYOR

Aramak için Yazın

C# DESKTOP APPLICATION DEVELOPMENT

C# Koleksiyonlar – Collections Ders 5

Paylaş

Koleksiyon Sınıfları

System.Collections veri saklama için kullanılan sınıflarımızın bulunduğu isim alanıdır. Bu öğrenme faaliyetinde Koleksiyon isim alanı içerisinde yer alan sınıfları inceleyeceğiz.

ArrayList

ArrayList, kısaca sınırları dinamik olarak değiĢebilen diziler olarak tanımlanır. Dizinin benzeridir fakat sadece object tipinden verileri saklar. Yani içeriğin bir kısmı int türünde, bir kısmı string türünde veya bool türünde olabilir. Belirli bir türde olma zorunluluğu yoktur.

Ayrıca belirli bir sınır vermemize gerek yoktur. Yeni nesne eklendikçe boyutunu otomatikman arttırır. Add, Remove, Sort ve indeksleme metotlarına sahip olması işlem yapmayı kolaylaştırır.

Klasik bir dizide karşılaşabileceğimiz sorunlar genel olarak şu şekildedir;

  • Dizi boyutları sınırlıdır ve sabittir,
  • Dizilerin tüm elemanları aynı türden olmalıdır,
  • Kullanmadığımız dizi elemanlarından dolayı bellek alanları gereksiz yere işgal edilmektedir.

ArrayList ve klasik bir dizinin arasındaki farklılardan bazılarını inceleyelim.

5 elemanlık int türünde sayilar isminde bir dizi tanımlayalım ve bu dizi içerisine 10 adet veri girmeye çalışalım.

Yukarıdaki kodları çalıştırdığımız zaman Resim de görülen dizi sınır değer aşımı (IndexOutOfRangeException) hatasını alırız.

Oysa burada klasik bir dizi yerine dinamik bir yapıda bulunan ArrayList kullanmış olsaydık, dizi boyutu ile ilgili bir hata almazdık.

Şimdi de bir önceki adımda tanımladığımız sayilar dizimizin içerisine string ve bool türünde veriler eklemeye çalışalım.

Yukarıdaki kodları derlemeye çalıştığımız zaman “Türkiye” ve “true” ibarelerin altlarının kırmızı ile çizilmiş olduğunu ve burada bir hata olduğunu görürüz.Resim de görünen int türünden string türüne (Cannot implicitly convert type ‘string’ to ‘int’) ve int türünden bool türüne (Cannot implicitly convert type ‘bool’ to ‘int’) dönüştürememe hatalarını alırız.

Aynı atama işlemlerini bir de ArrayList kullanarak yapmayı deneyelim.

Bu kodların derlenmesi sırasında herhangi bir hata mesajı almaz ve verilerimizi başarılı bir şekilde sayilar isimli ArrayList içerisine aktarırız. Görüldüğü gibi ArrayListlere herhangi bir veri türünde veri ekleyebiliriz.

Queue – Stack

Queue (Kuyruk) ve Stack (Yığın) da içerisinde birden fazla veri depolayabildiğimiz yapılardandır.

Queue (Kuyruk) sınıfının özelliği ilk giren ilk çıkar (first-in first-out, FIFO) prensibine göre çalışır. Bir eleman arkaya sıradan katılır (enqueue işlemi) ve sırayı önden terk eder(dequeue işlemi).

Şekilde görüldüğü gibi Queue (Kuyruk) koleksiyon sınıfında elemanlar koleksiyona arkadan katılırlar ve ilk giren eleman kuyruktan ilk çıkan eleman olur.

yukarıdaki resim de  ku isimli 6 elemanlı Queue (Kuyruk) dizisi tanımlanmış. Elemanları (Ahmet, Selim, Zeki, Yılmaz, 123, false) diziye eklemek için enqueue metodu kullanılmıştır. Dequeue metodu kullanılarak ilk giren (en alttaki) elemanı verirken, aynı zamanda bu elemanı ku dizisinden siler. Ku dizisinin elemanlarını Ienumaratör ara yüzünden bir nesneye (dizi) aktarıyoruz. Current metodu ile dizi nesnesinde yer alan güncel elemanları elde ederiz. Böylelikle ku dizisindeki elemanlar koleksiyona arkadan katılır ve ilk giren eleman kuyruktan ilk çıkan eleman olur.

Ekran çıktısı aşağıdaki gibidir.

Stack (yığın) sınıfının özelliği “son giren ilk çıkar (last-in first-out, LIFO)” prensibine göre çalışmalarıdır. Bir eleman yığına üstten katılır (push işlemi) ve yığını yine üstten terk eder (pop işlemi). Bu yöntemi mutfaktaki kirli tabaklara benzetebiliriz. Her zaman ilk önce en üste konan tabak yıkanır.

şekilde görüldüğü gibi stack koleksiyonunda yer alan elemanlardan son girene ulaşmak oldukça kolaydır. Oysaki ilk girdiğimiz elemana ulaşmak için, bu elemanın üstünde yer alan diğer tüm elemanları silmemiz gerekmektedir.

Yukarıda stek isimli 6 elemanlı Stack (Yığın) dizisi tanımlanmış. Elemanları (ALİ, MEHMET, ZEHRA, ZEKİ, 16, True) diziye eklemek için Push methodu kullanılmıştır. Pop methodu kullanılarak son giren (kalan) elemanı verirken, aynı zamanda bu elemanı stek dizisinden siler. Stek dizisinin elemanlarını Ienumaratör arayüzünden bir nesneye (dizi) aktarıyoruz. Current methodu ile dizi nesnesinde yer alan güncel elemanları elde ederiz. Böylelikle stek dizisindeki elemanlara son katılan ilk çıkar, bir eleman yığına üstten katılır ve yığını yine üstten terk eder. Ekran çıktısı aşağıdaki gibidir.

Hashtable

Hashtable (KarıĢık masa) koleksiyon sınıfında veriler key-value (anahtar-değer) çiftleri şeklinde tutulmaktadırlar. Hashtable koleksiyon sınıflarında key ve value değerleri herhangi bir veri türünde olabilir. Temel olarak bunların hepsi DictionaryEntry (Sözlük GiriĢ) nesnesidir. Key – value çiftleri hash tablosu adı verilen bir tabloda saklanır.

Key değerleri tektir ve değiştirilemez. Yani bir key-value çiftini koleksiyonumuza eklediğimizde, bu değer çiftinin value değerini değiştirebilirken, key değerini değiştiremeyiz.

Hashtable koleksiyonu verilere hızlı bir Ģekilde ulaşmamızı sağlayan bir kod yapısına sahiptir. Bu nedenle özellikle arama maliyetlerini düşürdüğü için tercih edilmektedir.

Örnek: Bir konsol uygulaması oluşturarak, Hashtable (Karışık Masa) koleksiyon sınıfı kullanılarak ali, serdar ve utku isminde, yaşları sırasıyla 42, 28 ve 34 olan değerleri tablo şeklinde ekranda sırasıyla yazan program kodu yazılsın.

yukarıda yaslar isimli bir hashtable(karışık masa) sınıfı tanımlanarak anahtar (ali, serdar, utku) ve değer (42, 28, 34) çifti tablosu oluşturulmuştur. DictionaryEntry (Sözlük
giriş) nesnesi kullanılarak anahtar (key) ve değer (value) dizilerine erişim sağlanmıştır. Ġsim ve yas isminde anahtar ve değer çifti oluşturarak yaslar sınıfındaki tablo değerleri ekrana
yazdırılmıştır. Ekran çıktısı aşağıdaki gibidir.

SortedList

SortedList (Sıralı Liste) sınıfı, hashtable sınıfı ile benzerlik göstermektedir. SortedList sınıfı kullanarak anahtarları, değerlerle iliĢkilendirebiliriz. Hashtable‟dan farklı olarak anahtarlar dizisinin her zaman sıralanmış olmasıdır.

Bir SortedList sınıfına bir anahtar-değer çifti eklendiğinde anahtar, anahtarlar dizisinin sırasını bozmamak için doğru dizine alfabetik sıraya göre eklenir. Daha sonra değerde, aynı dizinli değerler dizisine eklenir. SortedList sınıfı, bir eleman eklediğinizde ya da bir elemanı kaldırdığınızda, otomatik olarak anahtarlar ve değerleri eş zamanlı hale getirir. Buda anahtardeğer çiftlerini SortedList‟e istediğiniz sırada ekleyebileceğiniz anlamına gelir, her zaman anahtarlara göre sıralanır.

Hashtable sınıfında olduğu gibi, bir SortedList aynı anahtardan iki tane içermez. Bir SortedList boyunca yineleme yapmak için bir foreach ifadesi kullanıldığında DictionaryEntry (Sözlük giriş) elde edilir. DictionaryEntry nesneleri key (anahtar) özelliği tarafından sıralanmış olarak döner.

Örnek: Bir konsol uygulaması oluşturarak SortedList (Sıralı Liste) koleksiyon sınıfı kullanılarak semih, metin ve ahmet isminde, yaşları sırasıyla 12, 67 ve 26 olan değerleri tablo şeklinde ekranda alfabetik sırayla yazan program kodu yazılsın.

yukarıda yaslar isimli bir SortedList (Sıralı Liste) koleksiyon sınıfı tanımlanarak anahtar (semih, metin, ahmet) ve değer (12, 67, 26) çifti tablosu oluşturulmuştur. DictionaryEntry (Sözlükgiriş) nesnesi kullanılarak anahtar (key) ve değer (value) dizilerine erişim sağlanmıştır. isim ve yas isminde anahtar ve değer çifti oluşturarak yaslar sınıfındaki tablo değerleri, isimler alfabetik sıraya göre ekrana yazdırılmıştır. Ekran çıktısı aşağıdaki gibidir.

Koleksiyon Başlatıcıları

Koleksiyon sınıflarında yapılan örnekler, bir koleksiyona o koleksiyon için en uygun yöntemi (ArrayList için Add, Stack için Pop gibi) kullanarak tek tek elemanları nasıl ekleyeceğinizi gösterir. Ayrıca diziler tarafından desteklenen sözdizimine (komut) oldukça benzer bir söz dizimi kullanarak, bazı koleksiyon türlerini tanımlarken aynı zamanda başlatabiliriz.

Örneğin aşağıdaki ifade, numaralar ArrayList dizisini oluşturur ve başlatır. Sürekli olarak Add yöntemi çağırmamıza gerek kalmaz.

ArrayList numaralar = new ArrayList(){10, 3, 4, 6, 9, 13};

Bu sözdizimini (komut satırı) sadece Add yöntemini destekleyen koleksiyonlar için kullanabiliriz (Stack ve Queue sınıfları desteklemez).

Hashtable gibi anahtar – değer çifti alan daha karmaşık koleksiyonlar için, aşağıdaki gibi her anahtar – değer çiftini başlatıcı listesinde anonim tür olarak belirleyebiliriz.

Hashtable yas = new Hashtable(){{“Serdar”, 24}, {“Ahmet”, 32}, {“Murat”, 27}};

Her çiftteki ilk eleman anahtar, ikincisi ise değerdir.

 

Etiketler:
Sonraki Makale

Yorum Bırak

Your email address will not be published. Required fields are marked *

Sıradaki