将 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));
请注意,第二个元素即优先级可以是对象或原始数据类型。
文档仅显示从 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));
请注意,第二个元素即优先级可以是对象或原始数据类型。