日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

.NET 6新特性试用 | PriorityQueue

發(fā)布時(shí)間:2023/12/4 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET 6新特性试用 | PriorityQueue 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

我們常用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 3

PriorityQueue

在.NET 6中,新增了PriorityQueue<TElement,TPriority>類,可以用來(lái)表示具有值和優(yōu)先級(jí)的集合。集合中的對(duì)象按照優(yōu)先級(jí)值從小到大的順序檢索。

例如,最后放入隊(duì)列的任務(wù)最緊急,需要有限處理:

var?jobs?=?new?PriorityQueue<Job,?int>();?jobs.Enqueue(new?Job()?{?Id?=?1?},?100); jobs.Enqueue(new?Job()?{?Id?=?2?},?100); jobs.Enqueue(new?Job()?{?Id?=?3?},?1);while?(jobs.TryDequeue(out?var?job,out?var?priority)) {Console.WriteLine(job.Id); }//輸出 3 1 2

自定義比較器

優(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。