C# Collections (Koleksiyonlar)

Merhaba arkadaşlar,

Bu yazımda sizlere programlama yaparken ihtiyaç duyduğumuz ve hayatımızı kolaylaştıran koleksiyon nesneleri hakkında edindiğim bilgilerden bahsedip koleksiyonları daha iyi anlamak için örnekler yapacağız.

Çoğu zaman projelerimizde karşımıza bir grup nesnesi ile çalışmamız gerekebilir. Bu grup nesnelerini oluşturduğumuz ve yönettiğimiz algoritmalar var. İşte bu algoritmaları kullanarak nesne gruplarımızı kolaylıkla yönetebiliriz.

Nesne gruplamanın iki yolu vardır; nesne dizileri oluşturarak gruplama ve nesne koleksiyonları oluşturarak gruplamak. C# Collection serimde bizler nesne koleksiyonları oluşturarak gruplamadan bahsedeceğiz.

.Net Framework, System.Collection isim alanında koleksiyon diye adlandırdığımız birçok sınıflar sunar. System.Collection isim alanında (namespace) en önemli sınıflar; ArrayList, SortedList, Bitarray, Hashtable, Stack ve Queue sınıflarıdır. Bu koleksiyon tabanlı sınıfların her birini bir başlık altında daha detaylı olarak inceleyip ve koleksiyon nesnelerini daha iyi anlamak için örnekler ile pekiştireceğiz.

System.Collection isim alanında bulunan diğer koleksiyon sınıflarını buradan daha detaylı inceleyebilirsiniz.

Koleksiyon nesnelerin avantajları

  • Aynı tür veya farklı türden birden fazla nesneyi koleksiyon çatısı altında bir arada tutabilir ve onları yönetebiliriz.
  • Klasik diziler derleme zamanında dizinin boyutunu belirtmek zorunluluğu vardı ama koleksiyon nesneleri dinamik boyutludur.
  • Koleksiyona eleman ekledikçe kapasite dinamik olarak değişmektedir. Yani Koleksiyon tabanlı nesnelerimize Ram’in kaldıracağı kadar eleman ekleyebiliriz.

Koleksiyon nesnelerinin dezavantajları

  • Koleksiyon tabanlı nesneler farklı türden verileri tutabilmek için object türüne ihtiyaç vardır. Hatırlarsak .Net platformunda Referans (Referans) ve Değer (Value) tipinde 2 farklı tür vardır. Referans tipler Ram’in Heap bölgesinde saklanırken Değer Tipler Ram’in Stack bölgesinde saklanır. Farklı türden verilerin object türüne dönüşümü boxing işlemdir. Koleksiyona eklenen her bir eleman için boxing işlemi uygulanır ve koleksiyondan elemanlara erişmek için de boxing işleminin tersi olan unboxing işlemi uygulanır ve gereksiz yere veri kopyalanır. Özellikle nesne değer tipinde ise boxing ve unboxing işlemleri koleksiyon tabanlı sınıflarda önemli ölçüde performans kaybına sebep olacaktır.
  • Farklı veri türlerinin koleksiyon çatısı altında tutmanın diğer bir dezavantajı ise tür güvenliğinin sağlanamamasıdır.

System.Collection isim alanı (namespace)

Koleksiyon tabanlı sınıflar aynı türden veya faklı türden birden fazla nesneyi bir arada tutup bu nesnelere farklı yollardan erişmemize sağlar. Bu isim alanında göreceğimiz Koleksiyon tabanlı sınıflar Array sınıfından farklıdır.

Bir koleksiyon nesnesi içinde bulunan elemanlara foreach yapısı ile erişebiliriz. Bu erişim koleksiyon nesnesinin IEnumerable arayüzü uygulamasından kaynaklanır. Buradan her koleksiyon tabanlı nesnelerin IEnumerable arayüzünü uyguladığı sonucunu çıkarabiliriz. Ayrıca her koleksiyon tabanlı nesneler kendi çıkarları doğrultusunda diğer arayüzleri uygulamış olabilirler.

Aşağıda kendi çalışma prensibine uygun ArrayList sınıfının diğer arayüzleri uyguladığı örneği var. Daha detaylı incelemek için buradan Microsoft Docs’a gidebilirsiniz.

ArrayList from VSCode

System.Collection isim alanında bulunan Sınıflar

  • ArrayList
  • BitArray
  • Comparer
  • Hashtable
  • Queue
  • SortedList
  • Stack

System.Collection isim alanında bulunan Arayüzler

  • ICollection: Bu arayüz bir koleksiyondaki en temel metotları ve özellikleri içerir
  • IComparer: Bu arayüz iki nesnenin nasıl karşılaştırılacağını uygular
  • IDictionary: Bu arayüzü anahtar-değer ikilisi gibi çalışan koleksiyon nesneleri uygular.
  • IEnumerable: Bu arayüz bir koleksiyon tabanlı nesnenin elemanları arasında ilerlemek için kullanılır.
  • IEnumerator: Bir koleksiyondaki her bir elemana erişmek ve işlem yapmak için kullanılır.
  • IDictionaryEnumerator: Bu arayüz anahtar-değer ikili çiftlerden sadece anahtar, sadece değer ya da hem anahtar hem değer ikilisini elde etmek için kullanılır.
  • IList: Bu arayüz ile koleksiyondaki her bir elemana sıfır tabanlı bir indeks ile erişebilmek için çeşitli metotlar ve özellikler içerir.
  • IHashProvider: Bu arayüz Object sınıfındaki GetHashCode() metodunu tanımlar.

System.Collection isim alanını bir bütün olarak diyagramda özetleyelim:

Bu serimde koleksiyonlara giriş yapıp System.Collection isim alanında bulunan arayüzler ve sınıflar hakkında genel bilgi verdik. bir sonraki yazımızda System.Collection isim alanında bulunan arayüzlerden ve sınıflardan bahsedip örneklerle pekiştiriyor olacağız.

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik

https://docs.microsoft.com/en-us/dotnet/api/system.collections?view=netframework-4.8

https://docs.microsoft.com/tr-tr/dotnet/csharp/programming-guide/concepts/collections

Leave a Comment