C# Collection Tipleri (Koleksiyonlar)

Array, ArrayList, List, LinkedList, Queue, Stack, SortedSet, SortedDictionary, SortedList, Dictionary, NameValueCollection, ConcurrentBag, ConcurrentQueue, ConcurrentStack, ConcurrentDictionary.

Array (Dizi)

Bir array (dizi), aynı tipten öğelerin sabit boyutlu bir koleksiyonudur. Diziler, sabit boyutlu bir öğe koleksiyonuyla çalışmanız gerektiğinde ve koleksiyonun boyutunu önceden bildiğinizde kullanışlıdır.

int[] numbers = new int[5] { 1, 2, 3, 4, 5};

Popüler Metotlar

  • CopyTo: Belirtilen dizinden başlayarak dizinin öğelerini başka bir diziye kopyalar.
  • IndexOf: Dizide belirtilen değerin ilk geçtiği dizinin index değerini döndürür.
  • Reverse: Dizideki öğelerin sırasını tersine çevirir.
  • Sort: Dizideki öğeleri sıralar.
  • Clone: Orijinal diziyle aynı öğelere sahip yeni bir dizi oluşturur.
  • BinarySearch: Bir ikili arama algoritması kullanarak dizide belirtilen bir değeri arar.

Öneri: Sabit sayıda öğeniz olduğunda ve bunlara dizine göre sık sık erişmeniz gerektiğinde Array’i kullanın.

ArrayList

Bir ArrayList, herhangi bir tipten nesnelerin dinamik olarak boyutlandırılmış bir koleksiyonudur. ArrayList, boyutu büyüyebilen veya küçülebilen bir nesne koleksiyonuyla çalışmanız gerektiğinde kullanışlıdır.

ArrayList list = new ArrayList();
list.Add("bir");
list.Add(2);

Popüler Metotlar

Add: ArrayList’in sonuna bir öğe ekler.

Remove: ArrayList’ten belirtilen bir nesnenin ilk öğesini siler.

Contains: Bir öğenin ArrayList içinde olup olmadığını belirler.

ToArray: ArrayList’in öğelerini yeni bir diziye kopyalar.

TrimToSize: ArrayList’in kapasitesini içerdiği gerçek öğe sayısına ayarlar.

Öneri: Boyutu dinamik olarak değişebilen bir nesne koleksiyonunuz olduğunda ve sık sık ekleme, kaldırma ve arama gibi işlemleri gerçekleştirmeniz gerektiğinde ArrayList’i kullanın.

  • Herhangi bir tipte element saklayabilirsiniz.
  • boxing/unboxing işleminden dolayı List<T>dec daha yavaş çalışır.

List<T>

List, belirli bir tipteki nesnelerin dinamik olarak boyutlandırılmış genel bir koleksiyonudur. Listeler, büyüyebilen veya küçülebilen bir nesne koleksiyonuyla çalışmanız gerektiğinde kullanışlıdır.

List<string> names = new List<string>();
names.Add("Fatih");
names.Add("Beyazıt");

Popüler Metotlar

Add: Listenin sonuna bir nesne ekler.

Contains: Bir öğenin List içinde olup olmadığını belirler.

Count: List içinde fiilen bulunan öğelerin sayısını verir.

Insert: Belirtilen dizindeki List öğesine bir öğe ekler.

Remove: Listeden belirli bir nesnenin ilk geçtiği yeri siler.

ToArray: List öğelerini yeni bir diziye kopyalar.

Öneri: Boyutları dinamik olarak değişebilen bir nesne koleksiyonunuz olduğunda ve sık sık ekleme, kaldırma ve arama gibi tür açısından güvenli işlemler gerçekleştirmeniz gerektiğinde List<T> kullanın.

  • Belirli bir türdeki öğeleri depolar.
  • Hızlı eleman erişimi.
  • Dizilerden daha fazla bellek kaplar.

LinkedList<T>

LinkedList<T>, listedeki herhangi bir pozisyona verimli bir şekilde eklenebilen veya çıkarılabilen belirli bir türdeki nesnelerin genel bir koleksiyonudur.

LinkedList<int> ints = new LinkedList<int>();
ints.AddFirst(5);
ints.AddLast(34);
ints.AddAfter(ints.First, 53);

Popüler Metotlar

AddFirst(T value): Belirtilen değeri LinkedList<T>’nin başına ekler.

AddLast(T value): Belirtilen değeri LinkedList<T>’nin sonuna ekler.

AddBefore(LinkedListNode node, T value): LinkedList<T> içinde belirtilen düğümden önce belirtilen değeri ekler.

AddAfter(LinkedListNode node, T value): LinkedList<T> içinde belirtilen düğümden sonra belirtilen değeri ekler.

GetEnumerator(): LinkedList için bir IEnumerator döndürür.

Öneri: Boyutu dinamik olarak değişebilen bir nesne koleksiyonunuz olduğunda ve koleksiyonun ortasında sık sık ekleme ve kaldırma işlemleri gerçekleştirmeniz gerektiğinde LinkedList kullanın.

  • Öğelerin hızlı bir şekilde eklenmesi/silinmesi.
  • Geçiş nedeniyle daha yavaş öğe erişimi.

Queue<T>

Queue<T> sınıfı, ilk giren ilk çıkar (FIFO) düzeninde düzenlenmiş bir nesneler koleksiyonudur. Öğeleri belirli bir sırayla işlemek istediğinizde kullanışlıdır.

Queue<string> queue = new Queue<string>();
queue.Enqueue("Coffe");
queue.Enqueue("Tea");
queue.Enqueue("Ice Tea");

Popüler Metotlar

Enqueue(T): Sıranın sonuna bir öğe ekler.

Dequeue(): Sıranın başındaki öğeyi kaldırır ve döndürür.

Peek(): Sıranın başındaki elemanı çıkarmadan döndürür.

TrimExcess(): Öğe sayısını eşleştirmek için kuyruğun kapasitesini azaltır.

Öneri: Bir FIFO (İlk Giren İlk Çıkar) düzenini izlemesi gereken bir nesne koleksiyonunuz olduğunda ve Sıraya Al ve Sıradan Çıkar gibi işlemleri sık sık gerçekleştirmeniz gerektiğinde Queue öğesini kullanın.

  • FIFO (First In First Out) veri yapısı.
  • Sonunda hızlı yerleştirme ve önden çıkarma.
  • Ortadan elemanların eklenmesi ve silinmesi zaman alıcıdır.

Stack<T>

Stack sınıfı, son giren ilk çıkar (LIFO) düzeninde düzenlenmiş bir nesneler koleksiyonudur. Öğeleri eklendikleri sıranın tersine işlemek istediğinizde kullanışlıdır.

Stack<string> stack = new Stack<string>();
stack.Push("Home");
stack.Push("Contact");
stack.Push("About");

Popüler Metotlar

Push: Yığının en üstüne bir öğe ekler.

Pop: Yığının en üstündeki öğeyi kaldırır ve döndürür.

Peek: ığının en üstündeki öğeyi çıkarmadan döndürür.

CopyTo: Yığın öğelerini bir diziye kopyalar.

GetEnumerator: Yığın öğelerini yinelemek için bir Enumerator (Numaralandırıcı) döndürür.

Öneri: LIFO (Son Giren İlk Çıkar) modeline uyması gereken bir nesne koleksiyonunuz olduğunda ve sık sık İt ve Aç gibi işlemleri gerçekleştirmeniz gerektiğinde.

  • LIFO tekniğini izleyen verileri yönetme.
  • Rastgele erişim mümkün değil.

HashSet<T>

HashSet<T> sınıfı, belirli bir sırası olmayan benzersiz nesnelerin bir koleksiyonudur. Koleksiyondaki öğelerin benzersiz olduğundan emin olmak istediğinizde kullanışlıdır.

HashSet<string> hashSet = new HashSet<string>();
hashSet.Add("Fatih");
hashSet.Add("Beyazıt");
hashSet.Add("Fatih"); //Fatih koleksiyonda bulunduğu için eklenmeyecektir.

Popüler Metotlar

Add(T item): Halihazırda yoksa HashSet’e bir öğe ekler.

UnionWith(IEnumerable other): Geçerli HashSet nesnesini, kendi içinde, belirtilen koleksiyonda veya her ikisinde bulunan tüm öğeleri içerecek şekilde değiştirir.

IntersectWith(IEnumerable other): Geçerli HashSet nesnesini yalnızca hem kendisinde hem de belirtilen koleksiyonda bulunan öğeleri içerecek şekilde değiştirir.

ExceptWith(IEnumerable other): Geçerli HashSet nesnesini yalnızca kendi içinde bulunan ve belirtilen koleksiyonda olmayan öğeleri içerecek şekilde değiştirir.

Öneri: Eşsiz nesnelerden oluşan bir koleksiyonunuz olduğunda ve sık sık ekleme, kaldırma ve arama gibi işlemleri gerçekleştirmeniz gerektiğinde HashSet<T> kullanın.

  • Hızlı arama, ekleme ve silme işlemleri.
  • Yinelenen değere izin vermez.
  • Eşsiz öğeleri belirli bir sırayla saklar.

SortedSet<T>

Benzersiz öğeleri sıralanmış düzende depolayan bir koleksiyon. Öğelerin hızlı bir şekilde aranmasını ve alınmasını sağlayan ağaç tabanlı bir veri yapısı olarak uygulanır.

SortedSet<string> sortedSet = new SortedSet<string>();
sortedSet.Add("Fatih");
sortedSet.Add("Fatih");
foreach (string item in sortedSet)
{
    Console.WriteLine(item);
}
//Sonuc: Fatih

Popüler Metotlar

Add(T item): Belirtilen öğeyi sorted set’e ekler.

Remove(T item): Belirtilen öğeyi sorted set’den siler.

Max: Sorted Set’de ki maksimum öğeyi alır.

Min: Sorted Set’de ki minimum öğeyi alır.

Öneri: Sıralanmış bir düzende saklanması gereken benzersiz nesnelerden oluşan bir koleksiyonunuz olduğunda ve sık sık ekleme, kaldırma ve arama gibi işlemleri gerçekleştirmeniz gerektiğinde SortedSet<T> kullanın.

  • Benzersiz öğeleri sıralanmış düzende saklar.
  • Hızlı arama, ekleme ve silme işlemleri.
  • Yalnızca aynı türdeki öğeleri depolayabilir.

Dictionary<TKey, TValue>

Dictionary – Anahtarlara dayalı olarak değerlerin hızlı aranmasını sağlayan bir key-value çiftleri koleksiyonu.

Dictionary<string, int> personAges = new Dictionary<string, int>();
personAges.Add("Fatih", 36);
personAges.Add("Beyazıt", 34);
personAges.Add("Cem", 24);

Popüler Metotlar

Add(TKey, TValue): Belirtilen key/value çiftini sözlüğe ekler.

ContainsKey(TKey): Sözlüğün belirtilen key’i içerip içermediğini belirler.

ContainsValue(TValue): Sözlüğün belirtilen value’u içerip içermediğini belirler.

Remove(TKey): Belirtilen anahtara sahip öğeyi Dictionary’den siler.

TryGetValue(TKey, out TValue): Belirtilen anahtarla ilişkili değeri alır.

Keys: Dictionary’deki key (anahtarların) bir koleksiyonunu alır.

Values: Dictionary’deki value (değerlerin) bir koleksiyonunu alır.

Öneri: Key-value çiftlerinden oluşan bir koleksiyonunuz olduğunda ve ekleme, kaldırma ve arama gibi işlemleri gerçekleştirmeniz gerektiğinde Dictionary kullanın.

  • Öğelerin hızlı aranması ve eklenmesi.
  • Karma çarpışmalar nedeniyle daha yavaş öğe erişimi
  • Key/Value çiftlerini depolar

SortedDictionary<TKey, TValue>

Dictionary<TKey, TValue>’a benzer, ancak anahtarlar sıralı düzende saklanır.

SortedDictionary<string, string> keyValues= new SortedDictionary<string, string>();
keyValues.Add("txt", "notepad.exe"); //Dictionary'de olmayan öğeleri ekleyin.
keyValues.Add("bmp", "paint.exe");
//Gönderilen key varsa dictionary'de add metodu exception fırlatır.
try
{
    keyValues.Add("txt", "winword.exe");
}
catch (Exception)
{
    Console.WriteLine("txt key zaten var.");
}

Popüler Metotlar

Add(TKey, TValue): Bu metot, SortedDictionary’ye yeni bir key/value çifti eklemek için kullanılır.

Remove(TKey): Bu metot, belirtilen anahtara dayalı olarak bir key/value çiftini SortedDictionary’den kaldırmak için kullanılır.

ContainsKey(TKey): Bu metot, SortedDictionary’nin belirtilen bir key içerip içermediğini kontrol etmek için kullanılır.

ContainsValue(TValue): Bu metot, SortedDictionary’nin belirtilen bir value içerip içermediğini kontrol etmek için kullanılır.

Keys: Bu özellik, SortedDictionary içindeki tüm keylerin bir koleksiyonunu döndürür.

Values: Bu özellik, SortedDictionary içindeki tüm value’ların bir koleksiyonunu döndürür.

Öneri: Key’e göre sıralanmış bir düzende saklanması gereken bir key-value çiftleri koleksiyonunuz olduğunda SortedDictionary kullanın, ekleme, çıkarma, arama gibi işlemleri sık sık yapmanız gerektiğinde.

  • Key/Value çiftlerini sıralı düzende saklar.
  • Hızlı arama, ekleme ve silme işlemleri.
  • Reference tipi referans türünde olduğunda value null olabilir.

SortedList<TKey, TValue>

SortedDictionary’a benzer, ancak koleksiyon, dizi tabanlı bir veri yapısı olarak uygulanır.

SortedList<int, string> sortedList = new SortedList<int, string>();
sortedList.Add(1, "bir");
sortedList.Add(3, "üç");
sortedList.Add(2, "iki");

Popüler Metotlar

Add: Bu metot, SortedList<TKey, TValue> öğesine yeni bir key/value çifti ekler.

Remove: Bu metot, SortedList<TKey, TValue>’de belirtilen key’e sahip key/value çiftini sistemden kaldırır.

Keys: Bu özellik, SortedList<TKey, TValue> içindeki key’leri içeren bir koleksiyon alır.

Values: Bu özellik, SortedList<TKey, TValue> içindeki değerleri içeren bir koleksiyon alır.

Öneri: SortedList: Key/Value çiftlerini sıralanmış düzende saklar, hızlı öğe erişimi sağlar, ancak kaydırma nedeniyle öğelerin eklenmesi/silinmesi daha yavaştır.

Öğeleri, key’e göre sıralanmış bir düzende.

Key-Value Çifti.

İkili aramada öğelere hızlı erişim.

Sabit kapasite.

Yavaş eklemeler.

Sıralanmamış bir listeden daha fazla bellek gerektirir.

NameValueCollection

Bir dictionary benzer, ancak tek bir anahtar için birden çok değere izin veren, adla erişilebilen bir dize koleksiyonu.

//Nesne oluşturma ve değer ekleme.
var headers = new NameValueCollection();
headers.Add("Content-type", "application/json");
headers.Add("Authorization", "Bearer abcdef123213");
//Değer çağırma
var contentType = headers.Get("Content-type");
//Değer silme
headers.Remove("Authorization");

Popüler Metotlar

Add: Koleksiyona yeni bir name-value çifti ekler.

Get: Belirtilen key ile ilişkili değeri döndürür.

GetAllKeys: Koleksiyondaki tüm keylerin bir dizisini döndürür.

GetAllValues: Koleksiyondaki tüm değerlerin bir dizisini döndürür.

GetValues: Belirtilen keylerle ilişkili bir dizi değer döndürür.

Set: Belirtilen keyle ilişkili değeri ayarlar.

Öneri: Yapılandırma ayarlarını veya HTTP başlıklarını depolamak için kullanılan dizelerdeki anahtar/değer çiftlerini depolar.

  • Tek bir anahtar için birden çok değere izin verir.
  • Öğelerin sırası garanti edilmez.
  • Yalnızca String anahtarlarını ve değerlerini destekler.

ConcurrentBag<T>

Öğeleri sırasız bir şekilde depolayan iş parçacığı açısından güvenli bir koleksiyon. Harici senkronizasyona ihtiyaç duymadan birden fazla iş parçacığından aynı anda eklenebilen, çıkarılabilen ve erişilebilen, iş parçacığı açısından güvenli bir öğe çantası sağlar.

ConcurrentBag<int> bag = new ConcurrentBag<int>();
Parallel.For(0, 100000, i => { bag.Add(i); });

int result;
while (bag.TryTake(out result))
{
    Console.WriteLine(result);
}

Popüler Metotlar

Add: Bag’e bir öğe ekler.

TryTake: Bir öğeyi bag’dan çıkarmaya ve iade etmeye çalışır. Bag boşsa, false döndürür.

ToList: Bag’deki tüm öğeleri içeren yeni bir List döndürür.

Count: Bag’daki öğelerin sayısını döndürür.

IsEmpty: Bag boşsa true, aksi takdirde false döndürür.

Öneri: Birden fazla iş parçacığının engellemeden öğe eklemesine veya kaldırmasına izin veren iş parçacığı güvenli koleksiyon.

  • Güvenli.
  • Kilitsiz bir algoritma kullanma.
  • Dizin tabanlı erişim yok.
  • Sırasız.

ConcurrentQueue<T>

ConcurrentQueue<T>, birden çok iş parçacığının birbirlerinin işlemlerine müdahale etmeden kuyruğa aynı anda erişebildiği, T türündeki öğelerin ilk giren ilk çıkar (FIFO) koleksiyonunu temsil eden iş parçacığı açısından güvenli bir veri yapısıdır.

ConcurrentQueue<string> ogeler = new ConcurrentQueue<string>();
ogeler.Enqueue("Öğe 1");
ogeler.Enqueue("Öğe 2");
ogeler.Enqueue("Öğe 3");

string item;
while (ogeler.TryDequeue(out item))
    Console.WriteLine(item);

Popüler Metotlar

Enqueue: ConcurrentQueue<T> öğesinin sonuna bir öğe ekler.

TryDequeue: ConcurrentQueue<T> başlangıcındaki nesneyi silme ve döndürme çalışır.

ToArray: ConcurrentQueue<T> öğesinin öğelerini yeni bir diziye kopyalar.

Contains: Bir öğenin ConcurrentQueue<T> içinde olup olmadığını belirler.

Öneri: Birden çok iş parçacığının engelleme olmadan bir FIFO sırasına öğe eklemesine veya kaldırmasına izin veren güvenli bir koleksiyon ihtiyaç olduğunda.

  • Eşzamanlı erişim için optimize edildi.
  • Ölçeklenebilirlik.
  • Sınırlı işlevsellik.
  • Indexleme yok.

ConcurrentStack<T>

ConcurrentStack<T>, birden çok iş parçacığının birbirlerinin işlemlerine müdahale etmeden yığına aynı anda erişebildiği, T türündeki öğelerin son giren ilk çıkar (LIFO) koleksiyonunu temsil eden C#’ta iş parçacığı açısından güvenli bir veri yapısıdır.

ConcurrentStack<string> cnStack = new ConcurrentStack<string>();
cnStack.Push("Öğe 1");
cnStack.Push("Öğe 2");
cnStack.Push("Öğe 3");

string item;
while (cnStack.TryPop(out item))
{
    Console.WriteLine(item);
}

Popüler Metotlar

Push: Stack’ın en üstüne bir öğe ekler.

TryPop: Stack’ın en üstündeki öğeyi silmeye ve döndürmeye çalışır. Stack boşsa, false döndürür.

TryPeek: Stack’ın en üstündeki öğeyi silmeden döndürmeye çalışır. Stack boşsa, false döndürür.

CopyTo: Belirli bir dizinden başlayarak stack’ın öğelerini bir diziye kopyalar.

Öneri: Birden fazla iş parçacığının engelleme olmadan bir LIFO sırasına öğe eklemesine veya kaldırmasına izin veren iş parçacığı koleksiyonu.

  • Öğeler, anahtara göre sıralanmış bir düzende olur.
  • Eşzamanlı erişim için optimize edildi.
  • Sınırlı işlevsellik.
  • Ölçeklenebilirlik.

ConcurrentDictionary<TKey, TValue>

ConcurrentDictionary<TKey, TValue>, birden çok iş parçacığının sözlüğe aynı anda birbirlerinin işlemlerine müdahale etmeden erişebildiği, anahtar/değer çiftlerinin bir koleksiyonunu temsil eden iş parçacığı açısından güvenli bir veri yapısıdır.

ConcurrentDictionary<int, string> dictionary = new ConcurrentDictionary<int, string>();
dictionary.TryAdd(1, "Öğe 1");
dictionary.TryAdd(2, "Öğe 2");

string value;
if (dictionary.TryGetValue(1,out value))
{
    Console.WriteLine(value);
}

dictionary.TryUpdate(1, "güncelendi Öğe 1", "Öğe 1");
dictionary.TryRemove(2, out value);

Popüler Metotlar

TryAdd: Key yoksa belirtilen key/value çiftini ekler veya key zaten varsa mevcut değeri günceller.

TryGetValue: Anahtar sözlükte varsa, belirtilen anahtarla ilişkili değeri alır.

GetOrAdd: Belirtilen key’le ilişkili değeri alır veya key yoksa yeni bir key/value çifti ekler.

Öneri: Birden çok iş parçacığının engelleme olmadan öğe eklemesine, güncellemesine veya kaldırmasına izin veren iş parçacığı koleksiyonu.

  • Güvenli.
  • Zengin işlevsellik.
  • Eş zamanlı erişim için optimize edildi.