架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 41|回复: 1

[资料] .NET6 中的 PriorityQueue 优先队列

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式
.NET 6 中引入了一个新的集合类型 PriorityQueue,正如它的名字那样,在普通的 Queue 基础之上增加了优先级的支持,接下来就一起来看一下怎么使用,以及一些常用的使用场景介绍。注意:他是非线程安全的,需要注意线程安全问题。

源码:超链接登录可见。

Get Started

来看一个简单的使用示例:
输出示例:

QQ截图20251020095608.jpg

可以看到输出的顺序和我们添加的顺序是相反的, PriorityQueue 在 Dequeue 的时候是从优先级最小开始的,值越小优先级越高,优先级越高越优先输出,如果我们希望最大先输出是不是可以呢,答案是肯定的,只是我们需要指定我们自己的优先级比较规则就可以了,可以参考后面的示例

Scenes

借助带优先级的自动排序,我们可以做一些自动排序的需求的时候可以考虑使用 PriorityQueue

Message Queue

借助 PriorityQueue 可以来实现一个优先级消息队列,允许用户在发消息的时候指定一个消息的优先级,在消费的时候就会按优先级。

在上面的示例里我们默认指定了一个 int 作为 Priority 的类型,并入队了一些消息,但是往往会有很多的消息,可能会出现优先级相同的情况,我们可以使用时间和int 作为一个联合的 Priority 类型,可以参考下面的示例:
输出示例如下:

QQ截图20251020095913.jpg

由上面的结果可以看出来,在 priority 一样的情况下,我们会先处理时间较小的消息,也可以根据自己的需要进行定制排序方式,自定义 Priority 比较逻辑即可。

Rank

在很多做排行榜的应用中也可以使用 PriorityQueue 来实现,比如我们来做一个学生成绩的排名

来看下面的示例代码:
上面的 list 就是一个成绩清单,随便写了几个测试数据,通过 PriorityQueue 的 UnorderedItems 我们可以拿到排序之前的数据,也是我们加入队列(Enqueue)的顺序,默认的比较是小的在前,也就是成绩低的在前,那我们想按从大到小排序的话就需要自定义比较方式。

上面的 High2LowComparer 就是一个自定义的比较,其实就是把比较的结果取了一个反,代码如下:
上面的输出结果如下:

QQ截图20251020100125.jpg

More

Redis 里有一个 zset(sortedSet) 类型的数据也可以做类似的事情,但是 zset 和 PriorityQueue 还是有一些不同的,zset 是一个 set,是一个自动去重的集合,而 PriorityQueue 还是一个 Queue 不会去重,zset 可以修改对应元素的 priority(score),但是 PriorityQueue 目前不支持修改元素对应的优先级

PriorityQueue  可以解决我们的一些问题,但是有一些使用要注意的地方:

  • 首先如果 Priority 是一样的话,输出的顺序是有可能不一样的,这是由它内部的实现算法决定的,不能严格的保证顺序
  • PriorityQueue 是非线程安全的,需要注意线程安全问题
  • PriorityQueue 中的 Peek 方法只会获取 queue 里即将出队的元素,但是不会从队列中移除这个元素
(完)




上一篇:抖音商城爬虫分析定位6神,风控分析,现在应该是7神X-Perseus
下一篇:ebpf相关知识的链接
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 3 天前 | 显示全部楼层
典型应用场景

医院急诊叫号,任务调度系统,例如:优先叫危重病人,代码如下:
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-10-23 06:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表