.NET 6新特性试用 | PriorityQueue
前言
我們常用Queue<T>類來(lái)表示先進(jìn)先出(FIFO)集合,集合中的對(duì)象按照放入順序檢索。例如:
var?jobs?=?new?Queue<Job>();jobs.Enqueue(new?Job()?{?Id?=?1?}); jobs.Enqueue(new?Job()?{?Id?=?2?}); jobs.Enqueue(new?Job()?{?Id?=?3?});while?(jobs.TryDequeue(out?var?job)) {Console.WriteLine(job.Id); }//輸出 1 2 3PriorityQueue
在.NET 6中,新增了PriorityQueue<TElement,TPriority>類,可以用來(lái)表示具有值和優(yōu)先級(jí)的集合。集合中的對(duì)象按照優(yōu)先級(jí)值從小到大的順序檢索。
例如,最后放入隊(duì)列的任務(wù)最緊急,需要有限處理:
自定義比較器
優(yōu)先級(jí)TPriority不必是數(shù)字,可以是任何類型,只要它的實(shí)例之間能比較大小。甚至,我們可以使用自定義比較器,實(shí)現(xiàn)復(fù)雜的優(yōu)先級(jí)計(jì)算邏輯。
例如,我們按數(shù)字從大到小的順序排列優(yōu)先級(jí):
var?jobs?=?new?PriorityQueue<Job,?int>();?jobs.Enqueue(new?Job()?{?Id?=?1?},?100); jobs.Enqueue(new?Job()?{?Id?=?2?},?200); jobs.Enqueue(new?Job()?{?Id?=?3?},?300);while?(jobs.TryDequeue(out?var?job,out?var?priority)) {Console.WriteLine(job.Id); }public?class?JobComparer?:?IComparer<int> {public?int?Compare(int?x,?int?y){return?y.CompareTo(x);} }//輸出 3 2 1比較時(shí)機(jī)
那到底是放入隊(duì)列時(shí),還是從隊(duì)列取出時(shí)進(jìn)行比較呢?
我們用代碼進(jìn)行測(cè)試:
for?(int?i?=?1;?i?<=?3;?i++) {Console.WriteLine($@"Enqueue?{i}");jobs.Enqueue(new?Job()?{?Id?=?i?},?100?*?i); }for?(int?i?=?4;?i?<=?6;?i++) {Console.WriteLine($@"Enqueue?{i}");jobs.Enqueue(new?Job()?{?Id?=?i?},?-100?*?i); } for?(int?i?=?7;?i?<=?9;?i++) {Console.WriteLine($@"Enqueue?{i}");jobs.Enqueue(new?Job()?{?Id?=?i?},?100?*?i); }Console.WriteLine("Dequeue");while?(jobs.TryDequeue(out?var?job,out?var?priority)) {Console.WriteLine(job.Id); }//輸出 Enqueue?1 Enqueue?2 Compare(200,?100) Enqueue?3 Compare(300,?200) Enqueue?4 Compare(-400,?300) Enqueue?5 Compare(-500,?300) Enqueue?6 Compare(-600,?100) Enqueue?7 Compare(700,?100) Compare(700,?300) Enqueue?8 Compare(800,?300) Compare(800,?700) Enqueue?9 Compare(900,?700) Compare(900,?800) Dequeue Compare(200,?800) Compare(-400,?800) Compare(-500,?800) Compare(700,?800) Compare(100,?-600) Compare(300,?100) Compare(700,?300) 9 Compare(200,?700) Compare(-400,?700) Compare(-500,?700) Compare(300,?700) Compare(100,?-600) Compare(300,?100) 8 Compare(200,?300) Compare(-400,?300) Compare(-500,?300) Compare(100,?300) Compare(100,?-600) 7 Compare(200,?100) Compare(-400,?200) Compare(-500,?200) Compare(-600,?200) 3 Compare(-600,?100) Compare(-400,?100) Compare(-500,?100) 2 Compare(-600,?-500) Compare(-400,?-500) 1 Compare(-600,?-500) 4 5 6可以看到,放入和取出時(shí)都需要進(jìn)行優(yōu)先級(jí)比較。
放入時(shí)只和隊(duì)列最頂部的元素進(jìn)行比較,而取出時(shí)需要比較隊(duì)列中所有剩余元素的優(yōu)先級(jí)。
結(jié)論
通過(guò)上面的代碼,可以發(fā)現(xiàn)PriorityQueue實(shí)際把隊(duì)列中的元素分成了2堆:
Enqueue?8 Compare(800,?300) Compare(800,?700) Enqueue?9 Compare(900,?700) Compare(900,?800)你覺(jué)得這樣做有什么目的?歡迎到公眾號(hào)“My IO”上留言討論!
總結(jié)
以上是生活随笔為你收集整理的.NET 6新特性试用 | PriorityQueue的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ASP.NET Web API中实现版本
- 下一篇: WPF 不遮挡任务栏最大化和全屏显示