2012-01-30 196 views
3

我在C#中實現了一個通用的PriorityQueue作爲作業的一部分。 這些項目存儲在一個數組中。比較自定義類型

class PQueue<T> : IPQueue<T> 
{ 
    T[] items; 
    //.. 
} 

如何比較兩個項目。我猜PQueue實例化的類型必須實現IComparable/IComparer。如果是這樣,我怎樣才能比較items中的兩個元素?

什麼是設計這個優雅的方式。

回答

3

首先,你需要告訴C#是<T>實現IComparable<T>

class PQueue<T> : IPQueue<T> where T : IComparable<T> { 
    T[] items; 
    //.. 
} 

現在你可以比較各個項目,如:

var cmp = items[i].CompareTo(items[j]); 
if (cmp < 0) { 
    // items[i] is less than items[j] 
} else if (cmp > 0) { 
    // items[i] is greater than items[j] 
} else { 
    // Items are equal 
} 
+0

想知道如果我沒有指定'where T:IComparable ' – Nemo 2012-01-30 02:17:38

+2

@Nemo會發生什麼沒有約束,編譯器會告訴你'items [i]'沒有一個名爲'CompareTo'的方法。 – dasblinkenlight 2012-01-30 02:18:57

1

你可能尋找generic constraints,讓您指定T必須執行IComparable

class PQueue<T> : IPQueue<T> where T : IComparable<T> 
{ 
    // ... 
} 
0

首先,你的自定義類型(T)必須有一個排序順序

無論是T是一個內置的號碼類型如int,double等具有「天然」的排序順序;或者您必須將其定義/編碼到您的自定義類中。

也許有一些類屬性或屬性組合是屬於您可以用來爲您的自定義類決定排序順序的類型之一。

字母字符具有「自然」排序順序。請記住,給定字母的較低個案的排序順序不是順序的。當涉及到字符串時,如果大小寫不是必需的(爲了排序目的)在比較之前將字符串轉換爲較低(或較高,其實並不重要)。

你寫的任何枚舉都有排序順序,因爲它們基本上是整數。

的CompareTo()定義排序順序爲您的自定義類

This method是「橡膠符合道路」,其確定被比較的兩個對象的順序咕嚕代碼。 它的工作方式是您必須解決的問題。

關於您IPQueues類

陣列的內部集合似乎是一個好主意,不作爲數組的大小是固定的。 .NET有一個Queue class;可以爲你工作嗎?