.NET6新东西--PriorityQueue

简介: .NET6新东西--PriorityQueue

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

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);
}

输出结果如下:

10
20
30

在.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);
}

输出结果如下:

30
10
20

在上面的代码中优先级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);
    }
}

输出结果为:

30
20
10

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

目录
相关文章
|
9天前
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
30 7
|
5月前
|
存储 网络协议 程序员
【.NET Core】.NET中的流(Stream)
【.NET Core】.NET中的流(Stream)
62 7
.NET6新东西--CallerArgumentExpression
.NET6新东西--CallerArgumentExpression
203 0
.NET6新东西--CallerArgumentExpression
|
API
.NET6新东西--ConfigurationManager
.NET6新东西--ConfigurationManager
275 0
.NET 6新东西--PeriodicTimer
.NET 6新东西--PeriodicTimer
186 0
|
开发框架 安全 .NET
.NET6新东西--Random.Shared
.NET6新东西--Random.Shared
108 0
一起谈.NET技术,.Net4.0 Parallel编程(四)Task 上
  在之前的文章中,已经介绍过了Parallel Loop(上、中、下)的相关内容。本篇文章中会就Task基础部分进行些介绍。   初识Task   首先我们来构建一个简单的Task的Demo: static void Main(string[] args){ Task.Factory.StartNew(() => { Console.WriteLine("Hello word!"); }); Console.Read();}   在上面这段代码中我们构建出了一段非常简单的使用Task类的代码,通过其Factory属性的创建出一个Task。
783 0
一起谈.NET技术,.Net 4.0 Parallel 编程(五)Task (中)
  在上篇文章中我们看过了如何创建Task,本篇文章就各种类型Task的使用进行说明。   Task Continuations   首先我们来看看延续的Task,所谓的延续的Task就是在第一个Task完成后自动启动下一个Task。
831 0
|
机器学习/深度学习 算法
.Net中集合排序还可以这么玩
背景: public class StockQuantity { public StockQuantity(string status, DateTime dateTime, int quantity) { Status ...
1212 0