我是C#中的新成員。我試圖創建一個堆結構,並提出了這個問題:如何將「比較類」傳遞給我的堆結構?我的意思是,我想創建一個如下所示的堆:Heap<int, cmp<int>> heap = new Heap<int, cmp<int>>();
其中「cmp」是一個按照優先級順序堆棧的比較類(我使用C++中的priority_queue)。我有成功的(我認爲)在作出堆,需要一個最大最小比較器:C#傳遞一個比較類作爲通用類型
public class Heap<T, Priority>
where Priority : IPriority<T>, new()
where T : IComparable
{
private List<T> storage = new List<T>();
private Priority HeapPriority = new Priority();
private void UpHeap(int position)
{
for(var i = position; i > 0; i = (i - 1) >> 1)
{
// Check whether storage[i] is more Priority than storage[(i - 1) >> 1]
if (HeapPriority.MorePriority(storage[i], storage[(i - 1) >> 1])
.CompareTo(storage[i]) == 0)
{
storage.Swap(i, (i - 1) >> 1);
}
else break;
}
}
}
這裏是IPriority接口:
public interface IPriority<T>
where T : IComparable
{
T MorePriority(T a, T b);
}
,我用堆是這樣的:
public class Min<T> : IPriority<T>
where T : IComparable
{
public Min() { }
public T MorePriority(T a, T b)
{
return a.CompareTo(b) <= 0 ? a : b;
}
}
static public void TestHeap()
{
var heap = new Heap<Pair<long, int>, Min<Pair<long, int>>>();
heap.Add(Pair<long, int>(10, 20));
heap.Add(Pair<long, int>(21, 100));
// ...
}
但我想要一個堆,通過任何我想要的方式排序項目,不僅是最大最小訂單。此外,有沒有辦法使用「Ipriority.MorePriority」作爲靜態方法?,因爲它的工作方式與靜態方法一樣。任何人都可以給我一些建議嗎? 對不起,我的英語不好。
顯而易見的答案是使用'IComparer'。你爲什麼不呢?有許多可能的方法來解決這個問題。請嘗試_something_。如果你之後有一個具體的問題,用一個好的[mcve]發表一個新問題,清楚地表明你正在遇到的具體問題。 –
謝謝。我會記住這一點。這是我的第一個問題,所以我很抱歉提出一些愚蠢的問題 –
沒有問題是愚蠢的。這裏的問題是,沒有任何跡象表明您花時間研究可能的答案,不必介意在嘗試實施任何解決方案時遇到的具體問題。如果你錯過了顯而易見的事實並且事實上就是答案,那很好,但即使有人錯過了明顯的答案,也可能會嘗試_something_。 –