C# programlama dilinde verileri organize bir şekilde saklamak ve işlemek için çeşitli koleksiyon tipleri mevcuttur. Bu koleksiyonlar; verileri bellekte etkili biçimde tutmak, erişmek ve yönetmek için kullanılır. Diziler, Listeler, Sözlükler ve diğer koleksiyon sınıfları, farklı ihtiyaçlara göre avantajlar sunar. Bu makalede C# koleksiyon tiplerinin kullanım alanları, performansları ve aralarındaki farklar detaylı olarak ele alınacaktır.
Diziler (Arrays)
Diziler, aynı veri tipinden birden fazla değeri içeren ve sabit boyutlu koleksiyonlardır. C#’da diziler, bellekte ardışık bir şekilde saklanır ve indeks numaraları ile erişilir. Diziler tanımlanırken eleman sayısı belirtilmelidir ve bu sayı daha sonra değiştirilemez.
int[] sayilar = new int[5]; // 5 elemanlı bir tamsayı dizisi
sayilar[0] = 10;
sayilar[1] = 20;
// ...
Diziler hızlı erişim sağlar ancak dinamik değildir. Eleman sayısı belli ve değişmeyecekse diziler tercih edilebilir. Ancak dizilerde eleman ekleme veya silme işlemleri doğrudan mümkün değildir. Bu yüzden daha esnek yapılara ihtiyaç duyulur.
List<T>
List<T>, System.Collections.Generic namespace’i altında bulunan, dinamik boyutlu bir koleksiyon türüdür. Dizilerin aksine boyutu çalışma zamanında değişebilir. Eleman ekleme, silme ve güncelleme işlemleri kolaydır.
List<string> isimler = new List<string>();
isimler.Add("Ahmet");
isimler.Add("Mehmet");
isimler.RemoveAt(0); // "Ahmet" silinir
List<T>, indeksleme ile erişim sağlar ve arka planda bir dizi kullanır. Ancak kapasitesi dolduğunda otomatik olarak yeni bir dizi oluşturarak elemanları kopyalar. Bu işlem performans açısından maliyetli olabilir, bu yüzden büyük veri setlerinde dikkatli kullanılmalıdır.
Dictionary<TKey, TValue>
Sözlük yapısı, anahtar-değer (key-value) çiftleri şeklinde veri saklamayı sağlar. Her anahtar benzersiz olmalıdır ve bu anahtarlar ile ilişkili değerlere hızlıca ulaşılabilir.
Dictionary<string, int> yaslar = new Dictionary<string, int>();
yaslar.Add("Ahmet", 25);
yaslar["Mehmet"] = 30;
int ahmetYas = yaslar["Ahmet"]; // 25
Dictionary<TKey, TValue>, veriye erişimde O(1) karmaşıklığına sahiptir. Bu nedenle hızlı arama işlemleri için idealdir. Ancak sıralı veri tutmaz ve indeksle erişim sunmaz.
Diğer Koleksiyon Tipleri
ArrayList
ArrayList, System.Collections namespace’inde yer alır ve tip güvenliği olmayan bir koleksiyon türüdür. Her türden veri alabilir ama boxing/unboxing işlemleri nedeniyle performans düşer.
LinkedList<T>
Bağlı liste (linked list) yapısı, elemanların bellekte ardışık olarak saklanmadığı, her elemanın kendisinden sonraki elemanı gösterdiği koleksiyon türüdür. Ekleme ve silme işlemleri hızlıdır, ancak indeksle erişim yavaştır.
Queue<T> ve Stack<T>
Queue<T>, FIFO (First In First Out) prensibiyle çalışır. Elemanlar eklenme sırasına göre çıkar. Stack<T> ise LIFO (Last In First Out) prensibiyle çalışır. Elemanlar sondan başa doğru çıkarılır.
Queue<int> kuyruk = new Queue<int>();
kuyruk.Enqueue(1);
kuyruk.Enqueue(2);
int ilkEleman = kuyruk.Dequeue(); // 1
Stack<string> yigin = new Stack<string>();
yigin.Push("A");
yigin.Push("B");
string sonEleman = yigin.Pop(); // "B"
HashSet<T>
HashSet<T>, benzersiz elemanlardan oluşan ve hızlı erişim sağlayan bir koleksiyon türüdür. Dictionary’ye benzer şekilde hash tabanlı çalışır ama sadece değer tutar. Elemanlar sıralı değildir ve indeksle erişim sunmaz.
SortedSet<T>
HashSet’in sıralı versiyonudur. Elemanları otomatik olarak sıralı şekilde tutar. Benzersiz elemanlar içerir ve ağaç yapısını temel alır.
Koleksiyon Tiplerinin Performans ve Kullanım Karşılaştırması
Diziler, sabit boyutlu ve hızlı erişim gerektiren durumlarda tercih edilir. List<T> ise dinamik yapıda ve esnek veri işleme ihtiyaçlarında idealdir. Dictionary<TKey, TValue>, veriye hızlı erişim gereken anahtar-değer eşlemelerinde kullanılır. Queue<T> ve Stack<T> ise özel sıralama ihtiyaçlarında (FIFO, LIFO) tercih edilir. HashSet<T> ve SortedSet<T>, benzersiz elemanlarla çalışırken performans sağlar.
Her koleksiyon türünün kendi kullanım senaryosu vardır. Hangi koleksiyonun kullanılacağına karar verirken, verinin boyutu, erişim sıklığı, ekleme/silme işlemleri ve sıralama gereksinimi gibi faktörler göz önünde bulundurulmalıdır.
Sonuç
C# koleksiyon tipleri, verileri farklı ihtiyaçlara göre etkili bir şekilde yönetmeyi sağlar. Diziler hızlı ama statik, List<T> dinamik ama daha maliyetli, Dictionary<TKey, TValue> ise anahtar-değer eşlemelerinde yüksek performans sunar. Doğru koleksiyon tipini seçmek, uygulamanın verimliliği açısından büyük önem taşır. Kodunuzu optimize etmek için ihtiyaçlarınıza uygun koleksiyonları kullanmanız gerekir.