如何实现比C#通用容器更少和更大?

时间:2012-07-21 21:20:56

标签: c#

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

     } 
}

2 个答案:

答案 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使用运算符;但它需要拳击值类型和一点间接。