23.6.2013
4.44 / 25 oy

C# Dersleri 18-Koleksiyon Sınıfları

.Net Framework, System.Collections sınıfı ile öğeleri özel yollarla bir ayaraya toplayabilmemizi sağlayan sınıflar sunar. Koleksiyon sınıfları adı verilen bu sınıflar öğelerini nesne olarak tutarlar ve object türünde barındırırlar.

Koleksiyon sınıflarının bellek yönetimlerini daha iyi anlayabilmek için, int (değer türü) öğelerden oluşan bir dizi ile nesnelerden (referans türü) oluşan bir diziyi karşılaştıralım.

- int gibi değer türü öğelerden oluşan bir dizi, doğrudan int değerler tutacaktır.

- Nesne öğelerinden oluşan bir dizilere ise istediğimiz türden değerler ekleyebileceğimizi hatırlayarak, bu diziye eklenen int değerler üzerinden durumu inceleyelim. Nesne öğelerinden oluşan bir diziye int türünden bir değer eklediğinizde otomatik olarak kutulama (boxing) gerçekleşir ve dizi öğesi int değerin kutulanmış kopyasına başvurur.

Bu makale içerisinde bahsedilecek olan tüm koleksiyon sınıflarının öğe türü object’tir. Bu da, bu koleksiyon sınıflarına bir değer eklediğinizde kutulama işleminin her zaman gerçekleşeceği anlamına gelmektedir. object olmayan nesne türlerini tutan koleksiyon sınıflarından ise daha ileri konularda bahsetmemiz daha verimli olacaktır.

Koleksiyonların hazırlanmasının temel amacı, sıradan dizilerin getirdiği sınırlandırmaların çeşitli yöntemlerle aşılabilmesidir. Bu sınırlamalar,

- Dizileri yeniden boyutlandıramazsınız.

- Dizilerden öğe çıkartamazsınız çünkü öğe çıkartmanız durumunda diğer tüm öğelerin indeks değeri değişecektir. Kaydırma işlemini yapmamanız durumunda ise duplicate (çift) öğeler ile karşılaşılma tehlikesi vardır.

- Dizilere öğe eklemeniz durumunda, mevcut öğelerden birisini kaybetmek durumunda kalırsınız.

ArrayList Koleksiyon Sınıfı

Sıradan dizilerin sınırlandırmalarının aşılabilmesi için ArrayList koleksiyon sınıfının sunduğu çözümler:

- ArrayList kullanırken Remove yönteminden faydalanarak dilediğiniz öğeyi kolaylıkla kaldırabilirsiniz.

- Yeni bir öğe eklemek için Add metodunu kullanabilirsiniz, yeniden boyutlandırma işlemi ArrayList tarafından otomatik olarak düzenlenecektir. Add yöntemi ArrayList’in sonuna öğe eklemektedir.

- Dilerseniz ArrayList’in ortasına da Insert metodu ile öğe ekleyebilirsiniz.

-  ArrayList içerisinde indeks bazlı değer çekmek için dizilerde olduğu gibi köşeli parantez kullanarak dilediğiniz öğeye erişebilirsiniz.

ArrayList’in en sık kullanılan metodları ile bir örnek hazırlarsak;

ArrayList sayilar = new ArrayList();

        foreach (int sayi in new int[12]{10, 9, 8, 7, 7, 6, 5, 10, 4, 3, 2, 1})

        {

            sayilar.Add(sayi);// ArrayList’i doldur

        }

        // listede sondan bir önceki sıraya bir öğe gir ve sondaki öğeyi yukarı taşı

        sayilar.Insert(sayilar.Count - 1, 99); //(ilk parametre konum;ikinci parametre eklenen öğe)

 

        sayilar.Remove(7);// değeri 7 olan ilk öğeyi kaldır (4. öğe, dizin 3)

 

        sayilar.RemoveAt(6);// şimdi 7. öğe olan öğeyi kaldır, dizin 6 (10)

 

        for (int i = 0; i < sayilar.Count; i++)

        {

            int sayi = (int)sayilar[i]; // değerin kutulamasını kaldıran dönüştürmeyi gör

            Console.WriteLine(sayi);

        }

 

        foreach (int sayi in sayilar) // dönüştürme gerekmez

        {

            Console.WriteLine(sayi);

        }

        }

Çıktı:

10

9

8

7

6

5

4

3

2

99

1

10

9

8

7

6

5

4

3

2

99

Queue Koleksiyon Sınıfı

Türkçe kuyruk/sıra anlamına elen Queue sınıfında, adına benzer şekilde ilk girenin ilk çıkacağı bir sistem oluşturulmuştur. Her yeni öğe sıraya en arkadan katılır (enqueue) ve sırayı önden terk eder (dequeue).

Örnek verecek olursak;

Queue sayilar = new Queue();

 

// kuyruğu dolduralım

foreach (int sayi in new int[4] { 9, 3, 7, 2 })

{

    sayilar.Enqueue(sayi);

    Console.WriteLine(sayi + " sayısı sıraya girdi");

}

 

// kuyruktaki elemanları yazdıralım

foreach (int sayi in sayilar)

{

    Console.WriteLine(sayi+" sayısı şu an sırada");

}

 

// kuyruğu boşaltalım

while (sayilar.Count > 0)

{

    int sayi = (int)sayilar.Dequeue(); // değerin kutulamasını kaldırmak için gerekli dönüştürme

    Console.WriteLine(sayi + " sayısı sıradan ayrıldı");

}

 

Çıktı:

9 sayısı sıraya girdi

3 sayısı sıraya girdi

7 sayısı sıraya girdi

2 sayısı sıraya girdi

9 sayısı şu an sırada

3 sayısı şu an sırada

7 sayısı şu an sırada

2 sayısı şu an sırada

9 sayısı sıradan ayrıldı

3 sayısı sıradan ayrıldı

7 sayısı sıradan ayrıldı

2 sayısı sıradan ayrıldı

 

Stack Koleksiyon Sınıfı

Türkçe’ye yığın olarak çevirebileceğimiz Stack sınıfı ise son giren ilk çıkar yapısında işlemektedir. Üst üste tabaklar gibi de düşünebileceğimiz Stack sınıfına her yeni öğe en üstten katılır (Push) ve yine üstten terkeder (Pop).

 

Stack sayilar = new Stack();

 

// yığını doldur

foreach (int sayi in new int[4] { 9, 3, 7, 2 })

{

    sayilar.Push(sayi);

    Console.WriteLine(sayi + " numaralı tabak eklendi");

}

 

// yığın boyunca yinele

foreach (int sayi in sayilar)

{

    Console.WriteLine("önce"+sayi + " numaralı tabak yıkanacak");

}

 

// yığını boşalt

while (sayilar.Count > 0)

{

    int sayi = (int)sayilar.Pop();

    Console.WriteLine(sayi + " numaralı tabak yıkandı");

}

Çıktı:

9 numaralı tabak eklendi

3 numaralı tabak eklendi

7 numaralı tabak eklendi

2 numaralı tabak eklendi

önce 2 numaralı tabak yıkanacak

önce 7 numaralı tabak yıkanacak

önce 3 numaralı tabak yıkanacak

önce 9 numaralı tabak yıkanacak

2 numaralı tabak yıkandı

7 numaralı tabak yıkandı

3 numaralı tabak yıkandı

9 numaralı tabak yıkandı

 

Hashtable Koleksiyon Sınıfı

Hashtable sınıfı, birisi anahtar değer diğeri ise asıl değer olmak üzere iki nesne dizisini tutabilen bir koleksiyon sınıfıdır. Eklenen bu anahtar/değer çiftlerinden hangi anahtarın hangi değere ait olduğu takip edilerek istenilen veriye ulaşılabilmesi amaçlanır.

Bir Hashtable sınıfı tasarlarken dikkat edilmesi gereken unsurlar:

- Anahtar değerler eşsiz (unique) olmalıdır, yani bir Hashtable içerisinde aynı anahtar değerinden birden fazla bulunamaz.

- Bir Hashtable’a yeni anahtar eklerken ContainsKey metodu ile o anahtarın zaten içerilip içerilmediğini kotrol edebilirsiniz.

- Hashtable sınıfı, bellek tüketimi konusunda oldukça bonkördür. Hashtable’lar, barındırdıkları öğeler arttıkça oldukça yüksek miktarda bellek tüketebilirler.

- Hashtable içerisinde foreach döngüsü ile yineleme yapmak için DictionaryEntry sınıfından yararlanabilirsiniz. Bu sınıf, Key anahtarı ve Value özelliği ile Hashtable ile oldukça uyumludur.

Sınıfımızdaki insanların adlarını (anahtar) ve yaşlarını (değer) saklamak için kullanabileceğimiz örnek bir Hashtable:

Hashtable yaslar = new Hashtable();

// Hashtable’ı dolduralım

yaslar["Metin"] = 21;

yaslar["Songül"] = 22;

yaslar["İsmet"] = 19;

yaslar["Ayşe"] = 23;

// Yineleyici key/value çiftini içeren DictionaryEntry nesnesini oluşturur

foreach (DictionaryEntry element in yaslar)

{

string ad = (string)element.Key;

int yas = (int)element.Value;

Console.WriteLine("{0} adlı öğrencinin yaşı:{1}", ad, yas);

}

Çıktı:

Metin adlı öğrencinin yaşı: 21

Songül adlı öğrencinin yaşı: 22

İsmet adlı öğrencinin yaşı: 19

Ayşe adlı öğrencinin yaşı: 23

 

SortedList Koleksiyon Sınıfı

Hashtable sınıfında olduğu gibi anahtar/değer ikililerini saklayabileceğimiz SortedList koleksiyon sınıfının Hashtable’dan farkı, sakladığımız değerlerin her zaman sıralanmış düzende barındırılmasıdır. Bu sıralama işlemini her yeni öğe ekleme ve çıkarma işleminde otomatik olarak erçekleştiren SortedList sınıfında da, Hashtable sınıfında olduğu gibi anahtar değerlerden sadece bir tane bulundurulmalıdır.

Hashtable için hazırladığımız örneği SortedList için de tekrarlayacak olursak;

SortedList yaslar = new SortedList ();

// SortedList’i dolduralım

yaslar["Metin"] = 21;

yaslar["Songül"] = 22;

yaslar["İsmet"] = 19;

yaslar["Ayşe"] = 23;

// Yineleyici key/value çiftini içeren DictionaryEntry nesnesini oluşturur

foreach (DictionaryEntry element in yaslar)

{

string ad = (string)element.Key;

int yas = (int)element.Value;

Console.WriteLine("{0} adlı öğrencinin yaşı:{1}", ad, yas);

}

Çıktı:

Ayşe adlı öğrencinin yaşı: 23

İsmet adlı öğrencinin yaşı: 19

Metin adlı öğrencinin yaşı: 21

Songül adlı öğrencinin yaşı: 22

 

Not: Çok boyutlu olabildiğinden bahsettiğimiz dizilerin aksine, koleksiyon sınıfları tek boyutludur.

 

C# Dersleri 18-Koleksiyon Sınıfları
Bu makalenin telif hakkı ve tüm sorumlulukları yazara ait olup, şikayetler için lütfen bizimle iletişime geçiniz.
URL:
Etiketler:

Bu makale 3409 kez okundu

23.6.2013 tarihinde yazıldı
Reitix

Yorumlar

  • denci
    denci
    16.4.2018

    koleksiyon sınıfının verilerini veritabanından aldığı ve veritabanı üzerinde güncellediği (ms sql, mysql, oracle, mongo db, firebase, access vb.) kodları örnek senaryolar ile birlikte paylaşsanız daha da harikulade bir referans olurdu

  • superisielif
    superisielif
    15.1.2016

    eski site tasarımında kodlar için özel bir layout vardı, yazılım yazıları çoğalsa da yeniden farketseler

  • arif
    arif
    29.11.2014

    çok güzel, ama kodları daha okunur bir araçla düzenleme şansınız var mıdır?

Bu yazıya siz de yorum yapabilirsiniz