将 Lambda 比较器与 PriorityQueue 结合使用

Use Lambda Comparator with PriorityQueue

文档仅显示从 IComparer 派生,然后在 PriorityQueue 的构造函数中将派生的 class 指定为比较器,但是对于多个优先级队列,它会创建太多额外的 classes。

是否可以在 C# 中将 Lambda 比较器与 PriorityQueue class 一起使用?

一个相当标准的助手 class 应该是这样的:

    public class KeyComparer<T, TKey> : IComparer<T> 
    {
        private readonly Func<T, TKey> selector;
        private IComparer<TKey> comparer;
        public KeyComparer(Func<T, TKey> selector) : this(selector, Comparer<TKey>.Default){}
        public KeyComparer(Func<T, TKey> selector, IComparer<TKey> comparer) => (this.selector, this.comparer) = (selector, comparer);
        public int Compare(T x, T y) => comparer.Compare(selector(x), selector(y));
    }

您可以创建扩展方法或静态工厂方法来帮助避免显式创建比较器。

虽然其他答案很好,但其他用户评论中提到的快速 one-liner 解决方案是:

//Descending Sort, Integer
var queue = new PriorityQueue<int, int>(Comparer<int>.Create((x, y) => y - x));

//Ascending Sort, Object
var queue = new PriorityQueue<ObjectA, ObjectB>(Comparer<ObjectB>.Create((x, y) => x.Something.CompareTo(y.Something));

请注意,第二个元素即优先级可以是对象或原始数据类型。