2012-07-21 42 views
2

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

    } 
} 
+0

我不是很了解这个问题,但是你需要类似SortedList的东西吗? http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx – Haedrian 2012-07-21 21:24:37

+0

是的,相似,但我想在模板参数而不是构造函数中指定排序条件。 – Chan 2012-07-21 21:26:44

回答

6

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

public class PriorityQueue<T> { 
    private readonly IComparer<T> comparer; 
    public PriorityQueue(IComparer<T> comp = null) { 
     comparer = comp ?? Comparer<T>.Default; 
    } 
} 
+0

谢谢,所以我们无法在模板参数中指定此行为? – Chan 2012-07-21 21:29:28

+0

@Chan不,你不能将它作为模板参数,至少不如在C++中那么容易。问题是,您需要创建一个接口,将其用作限制,然后在每次要比较两个项目时创建一个“greater_then”的实例。这比“IComparere ”的实例效率低得多。 – dasblinkenlight 2012-07-21 21:33:51

+0

我明白了。非常感谢。 – Chan 2012-07-21 21:36:32

2

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

  • IComparable(非通用)
  • IComparable<T>(通用)
    • 和处理 “解除” 的操作通过Nullable<T>

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

但是!没有直接的方式通过限制来应用例如运营商的</>;运算符并不真正使用泛型 - 它与C++模板不一样。

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