在C#里处理需要按优先级出队的数据时,最方便的做法是使用.NET 6引入的PriorityQueue<TElement,TPriority>类。它内部基于堆实现,默认情况下优先级数值越小越先出队。

基本用法
下面的例子展示了如何创建优先级队列、入队和出队:
using System;
using System.Collections.Generic;
// 创建优先级队列,元素为字符串,优先级为int
PriorityQueue<string, int> pq = new PriorityQueue<string, int>();
// 入队:元素,优先级
pq.Enqueue("低优先级任务", 10);
pq.Enqueue("高优先级任务", 1);
pq.Enqueue("中优先级任务", 5);
// 出队,按优先级从小到大
while (pq.TryDequeue(out string item, out int priority))
{
Console.WriteLine($"处理: {item}, 优先级: {priority}");
}
运行后输出顺序为高优先级任务、中优先级任务、低优先级任务。
自定义优先级比较
如果不想用默认的升序比较,可以在构造时传入IComparer<TPriority>。例如让优先级数值越大越先出队:
using System;
using System.Collections.Generic;
// 自定义比较器:优先级大的先出
class DescComparer : IComparer<int>
{
public int Compare(int x, int y)
{
return y.CompareTo(x);
}
}
PriorityQueue<string, int> pq = new PriorityQueue<string, int>(new DescComparer());
pq.Enqueue("A", 1);
pq.Enqueue("B", 5);
pq.Enqueue("C", 3);
while (pq.TryDequeue(out string item, out int p))
{
Console.WriteLine(item);
}
常用方法和注意点
Enqueue:加入元素和优先级TryDequeue:尝试取出并移除优先级最高的元素Peek:查看而不移除队首元素Count:获取当前元素数量
需要注意,PriorityQueue不是线程安全的。如果在多线程环境中使用,需要自己加锁或者使用并发容器方案。
典型应用场景
| 场景 | 说明 |
|---|---|
| 任务调度 | 按紧急程度处理后台作业 |
| 搜索算法 | 如Dijkstra最短路中按距离出队 |
| 消息系统 | 高优先级消息优先消费 |
在选择合适的队列类型时,如果业务只关心先后顺序而不关心优先级,普通Queue<T>更简单;一旦涉及优先级,PriorityQueue能明显减少手写堆代码的工作量。
C#优先级队列PriorityQueue修改时间:2026-07-28 08:21:19