C#最优队列PriorityQueue使用比较器

对30个对象进行优先选择前4个,这个4个根据该对象的Info属性进行判断,它是自定义类型,所以需要用比较器来比较它的大小。

    public class CustomType
    {
        public int? ID { get; set; }
    }

    public class RecSample
    {
        public int Name { get; set; }
        public int Value { get; set; }
        public CustomType Info { get; set; }

        public RecSample()
        {
            Info = new CustomType();
        }
    }

    public class InfoComparer : IComparer<CustomType>
    {
        public int Compare(CustomType? x, CustomType? y)
        {
            if (x?.ID == null || y?.ID == null) return 0;
            return x.ID.Value.CompareTo(y.ID.Value);
        }
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            Random r = new Random();
            List<RecSample> list = new List<RecSample>();
            for (int i = 0; i < 30; i++)
            {
                list.Add(new RecSample
                {
                    Name = r.Next(0, 30),
                    Value = r.Next(0, 30),
                    Info = new CustomType { ID = r.Next(0, 30) }
                });
            }

            PriorityQueue<RecSample, CustomType> pq = new PriorityQueue<RecSample, CustomType>(new InfoComparer());
            foreach (var item in list)
            {
                if (pq.Count < 4)  //取前4个值
                    pq.Enqueue(item, item.Info);
                else
                    pq.EnqueueDequeue(item, item.Info);//能用合并的用合并,一定不要入队再出队的两步,浪费效率
            }

            Console.WriteLine("    " + pq.Count);
            while (pq.Count > 0)
                Console.WriteLine(pq.Dequeue().Info.ID);

            list.Sort((x, y) => Nullable.Compare(x.Info?.ID, y.Info.ID));
            foreach (var item in list)
                Console.Write(item.Info.ID.ToString() + ",");

            Console.ReadKey();
        }
    }

结果:

也可以在初始化时指定容量大小:
PriorityQueue<RecSample, CustomType> pq = new PriorityQueue<RecSample, CustomType>(5,new InfoComparer());

考虑到选择4个,指定为5,多一个用于比较,进入临时的入队和出队。

PriorityQueue并不像一般的队列或堆栈一样具有固定的容量限制。当创建一个PriorityQueue对象时,指定的容量参数通常用于内部数组的初始化,但并不限制队列的实际大小。因此,即使指定了容量为5,队列仍然可以动态增长以容纳更多元素。后面连续增加的话,它仍然会自动扩容。

个人觉得还是设置5吧,后面到4时再入队出队,一直保持最大极限5,这样它一直不会突破最初的容量,也就不会产生扩容情况。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 中,`PriorityQueue` 是 .NET Framework 中的一个内置数据结构,它是一种基于优先级的队列,其中元素的添加顺序取决于它们的优先级。当你需要按照特定的顺序处理任务或元素时,`PriorityQueue` 可以非常有用,例如在调度、事件处理或其他需要按优先级处理任务的场景。 下面是 `PriorityQueue` 在 C# 中的基本用法: 1. 创建 `PriorityQueue`:你可以使用泛型指定要存储的数据类型和默认的比较器(如果需要自定义排序)。 ```csharp PriorityQueue<int> queue = new PriorityQueue<int>(); ``` 2. 添加元素:使用 `Enqueue` 方法添加元素,`PriorityQueue` 会自动根据元素的默认或自定义比较器进行排序。 ```csharp queue.Enqueue(10); queue.Enqueue(5); queue.Enqueue(15); ``` 3. 删除并获取最高优先级元素:使用 `Peek` 方法查看当前队列中的最高优先级元素,但不删除它;`Dequeue` 方法则用于获取并移除最高优先级的元素。 ```csharp int highestPriority = queue.Peek(); // 返回 5 int removedElement = queue.Dequeue(); // 返回 5,现在队列里只剩 10 和 15 ``` 4. 自定义比较器:如果你想要用自定义的比较逻辑,可以在创建 `PriorityQueue` 时提供一个实现了 `IComparer<T>` 接口的类实例。 ```csharp class CustomComparator : IComparer<int> { // 实现 Compare 方法 } PriorityQueue<int, CustomComparator> customQueue = new PriorityQueue<int, CustomComparator>(new CustomComparator()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值