写点什么

.NET6 新东西 --PriorityQueue

作者:喵叔
  • 2021 年 12 月 25 日
  • 本文字数:942 字

    阅读完需:约 3 分钟

在.NET6 以前的版本中中我们为了表示先进先出集合通常会使用 Queue<T>类,这个集合中的对象一般会按照放入顺序检索。比如下面的代码:


var users = new Queue<User>();users.Enqueue(new User() { Name = "张三", Age = 10 });users.Enqueue(new User() { Name = "李四", Age = 20});users.Enqueue(new User() { Name = "王五", Age = 30 });users.Enqueue(new  while (users.TryDequeue(out var user)){    Console.WriteLine(user.Age);}
复制代码


输出结果如下:


102030
复制代码


在.NET6 中,新增了另一个能表示先进先出集合的类,就是 PriorityQueue<TElement,TPriority>类,它可以用来表示具有值和优先级的集合。它里面存储的对象按照优先级值从小到大的顺序检索。比如最后放入队列的任务必须优先处理,那么我们的代码可以这么写:


var users = new PriorityQueue<User, int>(); 
users.Enqueue(new User() { Name = "张三", Age = 10}, 100);users.Enqueue(new User() { Name = "里斯", Age = 20}, 100);users.Enqueue(new User() { Name = "王五", Age = 30}, 1); while (users.TryDequeue(out var user,out var priority)){ Console.WriteLine(user.Age);}
复制代码


输出结果如下:


301020
复制代码


在上面的代码中优先级 TPriority 是 int 类型,但是它可以不是数字,可以是任何类型,只要满足它的实例之间能比较大小就可以。甚至我们可以自定义比较器,实现更加复杂的优先级计算逻辑。比如按照年龄从大到小的顺序排列优先级并输出:


var users = new PriorityQueue<User, int>();users.Enqueue(new User() { Name = "张三", Age = 10 }, 100);users.Enqueue(new User() { Name = "里斯", Age = 20 }, 200);users.Enqueue(new User() { Name = "王五", Age = 30 }, 300);while (users.TryDequeue(out var job, out var priority)){    Console.WriteLine(job.Age);}public class UserComparer : IComparer<int>{    public int Compare(int x, int y)    {        return y.CompareTo(x);    }}
复制代码


输出结果为:


302010
复制代码


在这里一定会有读者疑问,比较是在什么时候进行的呢?是放入队列时还是从队列取出时呢?答案是放入和取出时都会进行优先级比较,放入时只和队列顶部元素进行比较,取出时需要比较队列中所有剩余元素的优先级。

用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
.NET6新东西--PriorityQueue