在C ++中,使用优先级队列我可以写:
priority_queue<int, vector<int>, greater<int>> min_pq;
priority_queue<int, vector<int>, less<int>> max_pq;
我想知道在C#容器中有相同的方法吗?我正在实现一个优先级队列,我需要一种方法来指定用户使用其构造函数时的这种行为。我可以使用boolean
标志,但它看起来不对我。有什么想法吗?
public class PriorityQueue<T> where T : IComparable<T> {
private List<T> data;
/// <summary>
///
/// </summary>
/// <param name="item"></param>
public void Push(T item) {
}
/// <summary>
///
/// </summary>
public void Pop() {
}
}
答案 0 :(得分:6)
C#中的惯用解决方案是将IComparer<T>
的实例传递给泛型类的构造函数。
public class PriorityQueue<T> {
private readonly IComparer<T> comparer;
public PriorityQueue(IComparer<T> comp = null) {
comparer = comp ?? Comparer<T>.Default;
}
}
答案 1 :(得分:2)
从一般意义上讲,这可以通过引用int Comparer<T>.Default.Compare(T x, T y)
来实现。这包含了许多不同的实现模式,包括:
IComparable
(非通用)IComparable<T>
(通用)
Nullable<T>
这基本上是List<T>
适用Sort()
等的方式
然而!没有直接的方法可以通过限制来应用<
/ >
运营商;运算符并不真正使用泛型 - 它与C ++模板不同。
另一种方法是使用dynamic
。因为这是按类型检查,而不是“对于所有T”,在泛型中,这允许dynamic
使用运算符;但它需要拳击值类型和一点间接。