“C# – Koleksiyonlar” başlıklı yazımızda koleksiyonların avantajlarından, dezavantajlarından bahsedip, genel bir bilgi vermiştik. Bu yazımızda ise bir koleksiyon sınıfı olan Queue(Kuyruk)‘dan bahsedeceğiz.
Queue Sınıfının Temel Yapısı
Queue (Kuyruk), ilk giren ilk çıkar işleyişine sahip bir koleksiyondur(FIFO). Koleksiyondan bir eleman çıkarılmak istenildiğinden, kuyruğun en önünde yer eleman çıkartılacaktır. Yeni eklenmek istenen bir eleman ise kuyruğun en sonuna eklenecektir.
Aslında bu veri yapısı günlük yaşantımızda şıkça karşılaştığımız ve gözlemlediğimiz bir işleyişe sahip. Fatura yatırmak için sıra bekleyen bir grup insanın oluşturmuş olduğu bir kuyruğu düşünecek olursak; Sıraya ilk giren kişi yani kuyruğun en önünde bulunan kişi, faturasını ilk yatıracak kişidir. Bu yüzden kuyruktan ilk bu kişi ayrılacaktır. Sıraya en son giren yani kuyruğun sonunda ki kişi ise faturasını en son yatıracak kişidir. Eğer sıraya başka bir kişi daha dahil olmak isterse, direk kuyruğun en sonuna geçip sırasını bekleyecektir.
Queue (Kuyruk) diğer koleksiyon sınıfları gibi dinamik bir yapıya sahiptir. Yani eleman eklendikçe boyutu dinamik olarak artmaktadır.
Queue sınıfının Enqueue() ve Dequeue() olmak üzere 2 temel metodu bulunmaktadır.
- Enqueue(): Kuyruğun sonuna bir eleman ekler.
- Dequeue(): Kuyruğun başındaki elemanı çıkarır.
Metotlara daha sonra detaylı bir şekilde değineceğiz. Bu kısımda dikkatinizi çekmek istediğim nokta; Eleman çıkarma işleminin kuyruğun başından, eleman ekleme işleminin de kuyruğun sonundan yapılmasıdır.
Metotlar ve Özellikler
- Nesne Oluşturma
Queue sınıfından bir nesne oluşturuyoruz. Bu nesne, koleksiyondaki nesnelerin referanslarını tutacaktır.// Queue içerisine sadece belirtilen veri tipindeki öğeler eklenebilir. // Eleman ekleme ve çıkarma işlemlerinde Boxing-Unboxing gerçekleşmez. Queue<int> kuyruk = new Queue<int>(); // Queue içerisine veri tipi fark etmeksizin her türlü öğe eklenebilir. // Eleman ekleme ve çıkarma işlemlerinde Boxing-Unboxing gerçekleşir. Queue kuyruk = new Queue();
- Enqueue(Eklenecek_Oge) ve Dequeue() Metotları
Enqueue() Metodu; Parametre olarak girilen öğeyi kuyruğun sonuna eklemektedir. Dequeue() Metodu; Kuyruğun başındaki öğeyi döndürür ve sonra öğe kuyruktan çıkarılır/silinir. Kuyruk boşken Dequeue() metodu çağrılırsa InvalidOperationException fırlatır.Queue<string> kuyruk = new Queue<string>(); // Kuyruğun başında bulunan katar:"Serdar Yılmaz" // Kuyruğun sonunda bulunan katar:"Cemal Çiftçi" kuyruk.Enqueue("Serdar Yılmaz"); kuyruk.Enqueue("Tarkan Tayşi"); kuyruk.Enqueue("Cemal Çiftçi"); // Silinen Öğe: Serdar Yılmaz try { string isim = kuyruk.Dequeue(); Console.WriteLine("Silinen Öğe:"+isim); } catch (InvalidOperationException) { Console.WriteLine("Kuyruk Boş."); } // Kuyrukta yer alan elemanlar ekrana yazdırıldı. foreach (string isim in kuyruk) Console.WriteLine(isim);
- Peek() Metodu
Kuyruğun başındaki öğeyi döndürmektedir, Dequeue() metodunda farklı olarak öğeyi kuyruktan çıkarmaz/silmez. Kuyruk boşken Peek() metodu çağrılırsa InvalidOperationException fırlatır.Queue<string> kuyruk = new Queue<string>(); // Kuyruğun başında bulunan katar:"Serdar Yılmaz" // Kuyruğun sonunda bulunan katar:"Cemal Çiftçi" kuyruk.Enqueue("Serdar Yılmaz"); kuyruk.Enqueue("Tarkan Tayşi"); kuyruk.Enqueue("Cemal Çiftçi"); // Ekran Çıktısı: Serdar Yılmaz // "Serdar Yılmaz" öğesi silinmez. try { string isim = kuyruk.Peek(); Console.WriteLine(isim); } catch (InvalidOperationException) { Console.WriteLine("Kuyruk Boş."); }
- Contains(Aranan_Öğe) Metodu
Kuyruk içerisinde parametre olarak girilen öğeyi arar. Öğe bulunursa TRUE, bulanamazsa FALSE döndürür.Queue<string> kuyruk = new Queue<string>(); kuyruk.Enqueue("Serdar Yılmaz"); kuyruk.Enqueue("Tarkan Tayşi"); kuyruk.Enqueue("Cemal Çiftçi"); // Ekran Çıktısı: Mevcut Değil. if (kuyruk.Contains("Ümit Özkan")) Console.WriteLine("Mevcut."); else Console.WriteLine("Mevcut Değil.");
- ToArray() Metodu
Kuyrukta yer alan elemanların kopyasını içeren bir dizi döndürür.Queue<string> kuyruk = new Queue<string>(); kuyruk.Enqueue("Serdar Yılmaz"); kuyruk.Enqueue("Tarkan Tayşi"); string[] Dizi = kuyruk.ToArray(); /* Ekran Çıktısı:Serdar Yılmaz Tarkan Tayşi */ for (int i = 0; i < Dizi.Length; i++) Console.WriteLine(Dizi[i]);
- Clear() Metodu ve Count Özelliği
Clear() Metodu; Kuyruğu temizlemektedir. Count Özelliği; Kuyruk içerisinde yer alan elemanların sayısını döndürmektedir.Queue<string> kuyruk = new Queue<string>(); kuyruk.Enqueue("Serdar Yılmaz"); kuyruk.Enqueue("Tarkan Tayşi"); // Ekrana "2" yazacaktır. Console.WriteLine(kuyruk.Count); kuyruk.Clear(); // Ekrana "0" yazacaktır. Console.WriteLine(kuyruk.Count);
Serdar Yılmaz
Merhaba,
Peek ve Dequeue işlemleri yapılırken exception almamak için(queue boş olduğu durum) TryPeek ve TryDequeue kullanılabilir. Bu methodlar hem daha performanslı hem de daha güvenli multi-thread uygulamalar için.
Queue invoices = new();
invoices.Enqueue(“a”);
invoices.Enqueue(“b”);
if (invoices.TryPeek(out string firstItem))
{
Console.WriteLine($”First item: {firstItem}”);
}
else
{
Console.WriteLine(“Queue is empty”);
}