2012-07-21 33 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使用運算符;但它需要裝箱價值類型和一點間接。