از کلاس PriorityQueue در NET 6 برای ایجاد صف هایی استفاده کنید که بر اساس مقادیر اولویتی که به عناصر اختصاص می دهید کار کنند.
صف یک ساختار داده است که بر اساس اولین ورود، اولین خروج (FIFO) کار می کند. اقلام در پشت صف قرار داده شده و از جلو حذف می شوند. عبارت “enqueue” به عملیاتی اشاره می کند که داده ها را در صف قرار می دهد، در حالی که اصطلاح “dequeue” به عملیاتی اشاره می کند که داده ها را از صف حذف می کند.
صف اولویت نوعی صف است که در آن عناصر بر اساس مقادیر اولویتی که به آنها اختصاص می دهید مرتب می شوند. پشتیبانی از صف اولویت به تازگی در .NET 6 معرفی شده است. این مقاله به کلاس PriorityQueue در NET 6 و نحوه کار با آن در برنامه های NET 6 ما می پردازد.
برای کار با نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخهای ندارید، میتوانید Visual Studio 2022 را از اینجا بارگیری کنید.
یک پروژه برنامه کاربردی کنسول در ویژوال استودیو ایجاد کنید
ابتدا، بیایید یک پروژه برنامه .NET Core Console Application در ویژوال استودیو ایجاد کنیم. با فرض اینکه Visual Studio 2022 در سیستم شما نصب شده است، مراحل ذکر شده در زیر را برای ایجاد یک پروژه جدید .NET Core Console Application در Visual Studio دنبال کنید.
- Visual Studio IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “Console App (.NET Core)” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود” که در ادامه نشان داده شده است، نام و مکان پروژه جدید را مشخص کنید.
- روی ایجاد کلیک کنید.
ما از این پروژه برای کار با صف اولویت در بخشهای بعدی این مقاله استفاده خواهیم کرد.
یک صف اولویت در .NET 6 ایجاد کنید
یک صف در NET 6 معمولاً یک ساختار داده FIFO است که در آن موارد به پشت صف اضافه شده و از جلو حذف می شوند. صف اولویت در NET 6 نوع خاصی از صف است که موارد را بر اساس مقادیر اولویتی که به آنها اختصاص می دهید مرتب می کند.
می توانید نمونه ای از کلاس PriorityQueue را با استفاده از سازنده کلاس PriorityQueue مطابق شکل زیر ایجاد کنید.
PriorityQueue<string, int> priorityQueue = new PriorityQueue<string, int>();
هنگامی که یک PriorityQueue ایجاد کردید، می توانید موارد را با استفاده از روش Enqueue() به صف اضافه کنید. روش Enqueue دو پارامتر را می پذیرد – عنصری که باید به عنوان رشته اضافه شود و اولویت عنصر به عنوان یک عدد صحیح.
توجه داشته باشید که موارد در یک صف اولویت به ترتیب نزولی مقادیر اولویتشان مرتب شدهاند. از این رو موردی که بیشترین مقدار اولویت را دارد (مثلاً ۹) در پشت صف قرار می گیرد و موردی که کمترین مقدار اولویت را دارد (مثلاً ۰) در جلو قرار می گیرد. به عبارت دیگر، dequeue موردی را با کمترین مقدار اولویت حذف می کند.
قطعه کد زیر نشان می دهد که چگونه می توانید موارد را با استفاده از روش Enqueue به صف اولویت اضافه کنید.
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
شما می توانید موارد را از PriorityQueue به دو روش مختلف بازیابی کنید. یکی از گزینه ها استفاده از متد Dequeue() است که آیتم را با کمترین مقدار اولویت در صف برمی گرداند. گزینه دیگر استفاده از متد Peek() است که آیتم را با کمترین مقدار اولویت بدون حذف آن از صف برمی گرداند.
متدهای TryDequeue و TryPeek نسخه های پیشرفته متدهای Dequeue و Peek هستند که استثناها را به صورت داخلی مدیریت می کنند. اگر موردی با موفقیت از صف حذف شده باشد true را برمیگردانند و در غیر این صورت false را برمیگردانند.
قطعه کد زیر نشان می دهد که چگونه می توانید موارد را از صف اولویت حذف کنید و هر مورد و اولویت آن را در پنجره کنسول نمایش دهید.
while (priorityQueue.TryDequeue(out string queueItem, out int priority))
{
Console.WriteLine($"Item : {queueItem}. Priority : {priority}");
}
نمونه صف اولویت کامل در NET 6
برنامه کامل برای مرجع شما در زیر آورده شده است.
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();
}
}
هنگامی که برنامه را اجرا می کنید، خروجی کنسول باید همانطور که در شکل ۱ در زیر نشان داده شده است ظاهر شود.
شکل ۱. صف اولویت بندی ما.
عناصر را در یک صف اولویت در NET 6 بشمارید
میتوانید از قطعه کد زیر برای بررسی تعداد موارد در صف اولویتبندی در هر نقطه از زمان استفاده کنید.
int ctr = priorityQueue.Count;
Console.WriteLine($"No of items remaining in the priority queue : {ctr}");
اگر این خطوط کد را بعد از دستور while در برنامه ما وارد کنید، همانطور که در زیر نشان داده شده است، تعداد موارد موجود در صف اولویت ۰ خواهد بود. این به این دلیل است که هر فراخوانی به روش TryDequeue یک عنصر را از اولویت حذف می کند. صف.
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}");
اگر برنامه ما را با کد بالا اجرا کنید، آیتم های صف اولویت و مقادیر اولویت آنها را نمایش می دهد. در نهایت، مقدار ۰ را چاپ می کند که نشان دهنده تعداد کل عناصر باقی مانده در صف اولویت در پایان است.
شکل ۲. صف اولویت ما با شمارنده عنصر.
یک صف اولویت در NET 6 از رابط IComparer برای تعیین اولویت عناصر ذخیره شده در داخل آن استفاده می کند. شما می توانید پیاده سازی خود را از رابط IComparer بنویسید و از آن برای تعیین اولویت های عناصر در یک صف اولویت استفاده کنید. من در این مورد در پست بعدی اینجا بیشتر بحث خواهم کرد.
در نهایت، توجه داشته باشید که یک نمونه PriorityQueue ایمن نیست. برای جلوگیری از شرایط مسابقه باید کد سفارشی خود را بنویسید تا ایمنی رشته را مدیریت کنید. صف های اولویت معمولاً توسط سیستم عامل ها برای متعادل سازی بار، زمان بندی رشته ها و مدیریت وقفه ها استفاده می شود. یک سیستم عامل از یک صف اولویت برای ذخیره رشته ها و برنامه ریزی یا پیش گرفتن آنها در صورت لزوم استفاده می کند.
پست های مرتبط
نحوه کار با صف اولویت در NET 6
نحوه کار با صف اولویت در NET 6
نحوه کار با صف اولویت در NET 6