.NET 6新特性试用 | PriorityQueue

前言

我们常用Queue<T>类来表示先进先出(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>类,可以用来表示具有值和优先级的集合。集合中的对象按照优先级值从小到大的顺序检索。

例如,最后放入队列的任务最紧急,需要有限处理:

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

自定义比较器

优先级TPriority不必是数字,可以是任何类型,只要它的实例之间能比较大小。甚至,我们可以使用自定义比较器,实现复杂的优先级计算逻辑。

例如,我们按数字从大到小的顺序排列优先级:

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

比较时机

那到底是放入队列时,还是从队列取出时进行比较呢?

我们用代码进行测试:

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

可以看到,放入和取出时都需要进行优先级比较。

放入时只和队列最顶部的元素进行比较,而取出时需要比较队列中所有剩余元素的优先级。

结论

通过上面的代码,可以发现PriorityQueue实际把队列中的元素分成了2堆:

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

你觉得这样做有什么目的?欢迎到公众号“My IO”上留言讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字效率Evernote超效率数字笔记术

文章结束给大家来个程序员笑话&#xff1a;[M] 每日一道理 古人云&#xff1a;“海纳百川&#xff0c;有容乃大。”人世间&#xff0c;不可能没有矛盾和争吵&#xff0c;我们要以磊落的胸怀和宽容的微笑去面对它 。哈伯德也曾说过&#xff1a;“宽恕和受宽恕的难以言喻的快乐&a…

千万别让爸妈帮你P图......

1 如何把外来称呼本土化&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 奇奇怪怪的知识又增加了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 好家伙&#xff01;洪世贤家烛台上插的是火腿肠▼4 妨碍公务的下场&#xff08;素材来源网络&#xff0c…

对大数据知识架构的梳理

近期交接了前期的大数据项目&#xff0c;对之前的项目内容做一个总结。也算是梳理一下项目的架构&#xff0c;对前期也算是一个总结&#xff0c;为后期的学习打下一个基础。清理数据对传统行业来说&#xff0c;上来就说要搞大数据&#xff0c;一般都会是一种噱头&#xff0c;因…

WPF 不遮挡任务栏最大化和全屏显示

在窗体不去边框的情况下&#xff0c;不遮挡任务栏最大化MainWindow.xaml.csusing System; using System.Windows; using System.Windows.Threading;namespace thzSoftware {/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWi…

C#中'??'符的使用

?? 用于判断当前对象是否为null. 语法: 对象 ?? "当前对象为null时赋的默认值". string nullString null; string Kong ""; string a nullString ?? "能判断为null"; string b Kong ?? "能判断为空"; 执行结果&#xff1…

将 iOS 应用的体积控制在 20MB 以内对于其下载量有很明显的影响吗?

分类&#xff1a;iPhone开发 标签&#xff1a;App大小、下载量、应用体积 比如&#xff0c;Angry bird 、Cut The Rope 游戏内容很丰富的应用都能将其体积控制在 20MB 。iOS 限制允许 3G 网络下载应用的体积不超过 20MB &#xff0c;通过 3G 下载的应用用户非常多吗&#xff1…

看完后震惊!清华“姚班”创始人的老师究竟有多牛?他说孩子最应该培养这几个思维……...

▲ 点击查看相信很多人都挺听说过清华有个“姚班”&#xff0c;致力于培养与美国麻省理工学院等世界一流高校本科生具有同等、甚至更高竞争力的计算机科学人才。“姚班”是我国著名科学家姚期智所创&#xff0c;因此得名“姚班”。姚期智教授是2000年图灵奖得主&#xff0c;也是…

Android之线程池

http://www.trinea.cn/android/java-android-thread-pool/ 介绍new Thread的弊端及Java四种线程池的使用&#xff0c;对Android同样适用。本文是基础篇&#xff0c;后面会分享下线程池一些高级功能。 1、new Thread的弊端 执行一个异步任务你还只是如下new Thread吗&#xff…

数据库自增主键可能产生的问题

在MySQL中经常会配置自增长属性的字段作为主键&#xff0c;特别是使用InnoDB存储引擎&#xff0c;因为InnoDB的聚集索引的特性&#xff0c;使用自增长属性的字段当主键性能更好&#xff0c;但是使用自增主键也可能会带来一些问题。 举个例子&#xff0c;使用自增主键对数据库做…

js中的hasOwnProperty和isPrototypeOf方法

转自&#xff1a;http://www.cnblogs.com/jenry/archive/2010/12/08/1900150.html hasOwnProperty&#xff1a;是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是&#xff0c;此方法无法检查该对象的原型链中是否具有该属性&#xff0c;该属性必须是对象本身的…

2021,我在枯燥乏味中寻找坚持下去的理由

这是头哥侃码的第248篇原创2021年&#xff0c;因为疫情和工作变更的关系&#xff0c;不仅我的工作方式被彻底改变&#xff08;居家远程办公&#xff09;&#xff0c;而且还在健身房悟出一个心得体会。啥心得&#xff1f;啥体会&#xff1f;那就是觉得人生逐渐变得没有意思。不知…

OM 延交訂單

如訂單扣數後要延交, 請按以下步驟: 1) 先取消要延交的ITEM 的DELIVERY NO. ACTION: Unassign from Dlivery 2) 要重新給DELIVERY NO ACTION: Auto-create Trip 3) 延交訂單item - Ship confirm - 選backorder all - OK 已完成延交, 可重新取move order

数据挖掘编程语言选择(Python与R的PK)

数据挖掘技术日趋成熟和复杂&#xff0c;随着互联网发展以及大批海量数据的到来&#xff0c;之前传统的依靠spss、SAS等可视化工具实现数据挖掘建模已经越来越不能满足日常需求&#xff0c;依据美国对数据科学家&#xff08;data scientist&#xff09;的要求&#xff0c;想成为…

Android之内存机制分析-Android堆和栈

1、dalvik的Heap和Stack 这里说的只是dalvik java部分的内存&#xff0c;实际上除了dalvik部分&#xff0c;还有native。这个以后再说。 下面针对上面列出的数据类型进行说明&#xff0c;只有了解了我们申请的数据在哪里&#xff0c;才能更好掌控我们自己的程序。 2、对象实例…

这部纪录片带你重新认识中华神州大地,领略你不知道的中国

你对自己的祖国熟悉嘛&#xff1f;你是否真正的去了解过自己祖国的各个省份呢&#xff1f;今天小编带来的这部纪录片《你所不知道的中国》&#xff0c;带你认识一个你从未了解的中国&#xff0c;让你从纪录片的视角去认识自己的祖国&#xff0c;重新认识哺育自己多年的神州大地…

B-树特征

在m阶B-树的定义中&#xff0c;要求&#xff1a; 1、树中每个节点至多有m棵子树。 2、若根节点不是叶子节点&#xff0c;则至少有两棵子树。 3、除根之外的所有非终端节点至少有棵子树。转载于:https://www.cnblogs.com/tonglingliangyong/p/3740964.html

首届微软研究峰会视频上线,快来查收你的独家观看指南!

由微软全球八大研究院携手倾力打造的首届微软研究峰会 Microsoft Research Summit 2021 已于此前在线上成功举办。来自世界各地的 300 余位顶尖科学家和技术领导者为大家带来了 150 场精彩分享&#xff0c;内容围绕“科学、赋能、可持续发展、医疗健康、信任”五大主题展开&…

Linux命令之tree

tree功能说明&#xff1a;以树状图列出目录的内容语法&#xff1a;tree [-aACdDfFgilnNpqstux] [-l <范本样式>] [-p <范本样式>] [目录]补充说明&#xff1a;执行tree指令&#xff0c;它会列出指定目录下的所有文件&#xff0c;包括子目录里的文件参数&#xff1a…

关于用函数指针参数申请动态内存的问题

今天在写一个Binary Search Tree的程序时&#xff0c;发现其插入有问题&#xff0c;下面是插入程序&#xff0c;每次插入完成后&#xff0c;节点还是NULL。 template<typename Object>void CMyTree<Object>::insert(const Object& element, BinaryNode<Obje…

当全家人一起看电影,播到羞羞镜头时......

1 我看你好眼熟哦&#xff08;via.松鼠少儿&#xff0c;侵删&#xff09;▼2 妹妹&#xff1a;有没有想过我感受&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 遇见五步蛇怎么办&#xff08;via.阿森不是妖怪&#xff0c;侵删&#xff09;▼4 一年级…