2

在 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() {

     } 
}
4

2 回答 2

6

C# 中的一个惯用解决方案是将 的实例传递IComparer<T>给泛型类的构造函数。

public class PriorityQueue<T> {
    private readonly IComparer<T> comparer;
    public PriorityQueue(IComparer<T> comp = null) {
        comparer = comp ?? Comparer<T>.Default;
    }
}
于 2012-07-21T21:24:58.783 回答
2

在一般意义上,这可以通过参考来实现int Comparer<T>.Default.Compare(T x, T y)。这包含了许多不同的实现模式,包括:

  • IComparable(非通用)
  • IComparable<T>(通用的)
    • 并通过以下方式处理“提升”操作Nullable<T>

这基本上是如何List<T>应用Sort()的,等等。

然而!没有直接的方法可以通过限制来应用</> 运算符;运算符并不真正适用于泛型 - 它与 C++ 模板不同。

另一种方法是使用dynamic. 因为这是按类型检查的,而不是在泛型中“针对所有 T”,这允许dynamic使用运算符;但它需要值类型的装箱和一些间接性。

于 2012-07-21T21:36:03.427 回答