[ad_1]
Kuyruk, ilk giren ilk çıkar (FIFO) temelinde çalışan bir veri yapısıdır. Öğeler kuyruğun arkasına eklenir ve önden çıkarılır. “Kuyruğa alma” terimi, kuyruğa veri ekleyen işlemi belirtirken, “kuyruğa alma” terimi, verileri kuyruktan kaldıran işlemi belirtir.
Öncelik sırası, öğelerin onlara atadığınız öncelik değerlerine göre düzenlendiği bir sıra türüdür. Öncelik sırası desteği .NET 6’da yeni tanıtıldı. Bu makalede .NET 6’daki PriorityQueue sınıfı ve .NET 6 uygulamalarımızda bununla nasıl çalışılacağı tartışılacaktır.
Bu makalede verilen kod örnekleriyle çalışmak için sisteminizde Visual Studio 2022 kurulu olmalıdır. Halihazırda bir kopyanız yoksa, Visual Studio 2022’yi buradan indirin.
Visual Studio’da bir konsol uygulama projesi oluşturun
Öncelikle Visual Studio’da bir .NET Core Console Application projesi oluşturalım. Sisteminizde Visual Studio 2022’nin kurulu olduğunu varsayarak, Visual Studio’da yeni bir .NET Core Konsol Uygulaması projesi oluşturmak için aşağıda belirtilen adımları izleyin.
- Visual Studio IDE’yi başlatın.
- “Yeni proje oluştur” u tıklayın.
- “Yeni proje oluştur” penceresinde, görüntülenen şablonlar listesinden “Konsol Uygulaması (.NET Core)” seçeneğini seçin.
- Sonrakine tıkla.
- Daha sonra gösterilen “Yeni projenizi yapılandırın” penceresinde yeni proje için ad ve konum belirtin.
- Oluştur’u tıklayın.
Bu makalenin sonraki bölümlerinde bir öncelik sırası ile çalışmak için bu projeyi kullanacağız.
.NET 6’da bir öncelik sırası oluşturun
.NET 6’daki bir kuyruk, tipik olarak, öğelerin kuyruğun arkasına eklendiği ve önden kaldırıldığı bir FIFO veri yapısıdır. .NET 6’daki öncelik sırası, öğeleri onlara atadığınız öncelik değerlerine göre sıralayan özel bir kuyruk türüdür.
Aşağıda gösterildiği gibi PriorityQueue sınıfının yapıcısını kullanarak PriorityQueue sınıfının bir örneğini oluşturabilirsiniz.
PriorityQueue<string, int> priorityQueue = new PriorityQueue<string, int>();
Bir PriorityQueue oluşturduktan sonra, Enqueue() yöntemini kullanarak kuyruğa öğeler ekleyebilirsiniz. Enqueue yöntemi, dize olarak eklenecek öğe ve tamsayı olarak öğenin önceliği olmak üzere iki parametre kabul eder.
Öncelik kuyruğundaki öğelerin azalan sipariş öncelik değerlerindendir. Bu nedenle, en büyük öncelik değerine sahip olan öğe (ör., 9) sıranın arkasına yerleştirilir ve en düşük öncelik değerine sahip olan öğe (ör., 0) ön tarafa yerleştirilir. Başka bir deyişle, bir kuyruktan çıkarma, en düşük öncelik değerine sahip öğeyi kaldırır.
Aşağıdaki kod parçacığı, Enqueue yöntemini kullanarak öğeleri bir öncelik sırasına nasıl ekleyebileceğinizi gösterir.
PriorityQueue<string, int> priorityQueue = new PriorityQueue<string, int>();
priorityQueue.Enqueue("Item A", 4);
priorityQueue.Enqueue("Item B", 3);
priorityQueue.Enqueue("Item C", 2);
priorityQueue.Enqueue("Item D", 6);
priorityQueue.Enqueue("Item E", 7);
priorityQueue.Enqueue("Item F", 5);
priorityQueue.Enqueue("Item G", 0);
priorityQueue.Enqueue("Item H", 9);
priorityQueue.Enqueue("Item I", 1);
priorityQueue.Enqueue("Item J", 8);
.NET 6’da bir öncelik kuyruğundan öğeleri alın
Öğeleri PriorityQueue’dan iki farklı şekilde alabilirsiniz. Bir seçenek, kuyruktaki en düşük öncelik değerine sahip öğeyi döndüren Dequeue() yöntemini kullanmaktır. Diğer seçenek, en düşük öncelik değerine sahip öğeyi kuyruktan kaldırmadan döndüren Peek() yöntemini kullanmaktır.
TryDequeue ve TryPeek yöntemleri, istisnaları dahili olarak işleyen Dequeue ve Peek yöntemlerinin geliştirilmiş sürümleridir. Bir öğe kuyruktan başarıyla kaldırıldıysa true, aksi takdirde false döndürürler.
Aşağıdaki kod parçacığı, öğeleri öncelik kuyruğundan nasıl kaldırabileceğinizi ve her bir öğeyi ve önceliğini konsol penceresinde nasıl görüntüleyebileceğinizi gösterir.
while (priorityQueue.TryDequeue(out string queueItem, out int priority))
{
Console.WriteLine($"Item : {queueItem}. Priority : {priority}");
}
.NET 6’da eksiksiz öncelik sırası örneği
Programın tamamı referansınız için aşağıda verilmiştir.
using System.Collections.Generic;
internal class Program
{
static void Main(string[] args)
{
PriorityQueue<string, int> priorityQueue =
new PriorityQueue<string, int>();
priorityQueue.Enqueue("Item A", 4);
priorityQueue.Enqueue("Item B", 3);
priorityQueue.Enqueue("Item C", 2);
priorityQueue.Enqueue("Item D", 6);
priorityQueue.Enqueue("Item E", 7);
priorityQueue.Enqueue("Item F", 5);
priorityQueue.Enqueue("Item G", 0);
priorityQueue.Enqueue("Item H", 9);
priorityQueue.Enqueue("Item I", 1);
priorityQueue.Enqueue("Item J", 8);while (priorityQueue.TryDequeue(out string queueItem, out int priority))
{
Console.WriteLine($"Item : {queueItem}. Priority : {priority}");
}
Console.Read();
}
}
Uygulamayı çalıştırdığınızda, aşağıdaki Şekil 1’de gösterildiği gibi konsol çıktısı görünmelidir.
Şekil 1. Öncelik sıramızın kuyruktan çıkarılması.
.NET 6’da bir öncelik kuyruğundaki öğeleri sayın
Herhangi bir zamanda öncelik kuyruğundaki öğelerin sayısını kontrol etmek için aşağıdaki kod parçacığını kullanabilirsiniz.
int ctr = priorityQueue.Count;
Console.WriteLine($"No of items remaining in the priority queue : {ctr}");
Aşağıda gösterildiği gibi programımızda while deyiminden sonra bu kod satırlarını eklerseniz, öncelik kuyruğundaki kullanılabilir öğelerin sayısı 0 olacaktır. Bunun nedeni, TryDequeue yöntemine yapılan her çağrının öncelik kuyruğundan bir öğeyi kaldırmasıdır.
while (priorityQueue.TryDequeue(out string queueItem, out int priority))
{
Console.WriteLine($"Item : {queueItem}. Priority : {priority}");
}
int ctr = priorityQueue.Count;
Console.WriteLine($"No of items remaining in the priority queue : {ctr}");
Programımızı yukarıdaki kod ile çalıştırırsanız, öncelik kuyruğunun öğelerini ve bunların öncelik değerlerini gösterecektir. Son olarak, öncelik kuyruğunda kalan toplam öğe sayısını gösteren 0 değerini yazdıracaktır.
Şekil 2. Eleman sayacı ile öncelik sıramız.
.NET 6’daki bir öncelik sırası, içinde depolanan öğelerin önceliğini belirlemek için IComparer arabirimini kullanır. IComparer arabiriminin kendi uygulamanızı yazabilir ve bunu bir öncelik kuyruğundaki öğelerin önceliklerini belirlemek için kullanabilirsiniz. Bunu gelecekteki bir yazıda burada daha ayrıntılı tartışacağım.
Son olarak, PriorityQueue örneğinin iş parçacığı için güvenli olmadığını unutmayın. Yarış koşullarından kaçınmak için iplik güvenliğini sağlamak için kendi özel kodunuzu yazmalısınız. Öncelik kuyrukları genellikle işletim sistemleri tarafından yük dengeleme, iş parçacığı zamanlaması ve kesintileri işlemek için kullanılır. Bir işletim sistemi, iş parçacıklarını depolamak ve gerektiğinde bunları zamanlamak veya önceden ayırmak için bir öncelik sırası kullanır.
Telif Hakkı © 2022 IDG Communications, Inc.
[ad_2]
Kaynak : https://www.infoworld.com/article/3666499/how-to-work-with-a-priority-queue-in-net-6.html#tk.rss_all