日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET 6新特性试用 | PriorityQueue

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

前言

我們常用Queue<T>類來表示先進(jìn)先出(FIFO)集合,集合中的對象按照放入順序檢索。例如:

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>類,可以用來表示具有值和優(yōu)先級的集合。集合中的對象按照優(yōu)先級值從小到大的順序檢索。

例如,最后放入隊(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)先級TPriority不必是數(shù)字,可以是任何類型,只要它的實(shí)例之間能比較大小。甚至,我們可以使用自定義比較器,實(shí)現(xiàn)復(fù)雜的優(yōu)先級計(jì)算邏輯。

例如,我們按數(shù)字從大到小的順序排列優(yōu)先級:

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)行測試:

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)先級比較。

放入時(shí)只和隊(duì)列最頂部的元素進(jìn)行比較,而取出時(shí)需要比較隊(duì)列中所有剩余元素的優(yōu)先級。

結(jié)論

通過上面的代碼,可以發(fā)現(xiàn)PriorityQueue實(shí)際把隊(duì)列中的元素分成了2堆:

Enqueue?8 Compare(800,?300) Compare(800,?700) Enqueue?9 Compare(900,?700) Compare(900,?800)

你覺得這樣做有什么目的?歡迎到公眾號“My IO”上留言討論!

總結(jié)

以上是生活随笔為你收集整理的.NET 6新特性试用 | PriorityQueue的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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