IComparable 介面

IComparable介面最重要者在於其定義 CompareTo 方法,用以比較實作這個介面的物件,此方法回傳一個int數值型別的結果值,其定義形的式如下:
int CompareTo (object obj ) 
物件引用這個方法,會與其參數 obj 作比較,並且根據比較的結果回傳結果值,當回傳值等於 0 的時候,表示兩個物件相等,若是傳回大於 0 的正值,引用方法的物件大於參數物件,反之則傳回小於零的整數值。

比較特別的是, IComparable 並非 Systm.Collection 的一員,其位於命名空間 System 。

若是要對集合中的物件作排序,新定義的集合類別必須實作 IComparable 介面,並且實作其中所定義的方法 CompareTo ,如果沒有完成此部份程式碼,則方法 Sort 無法被引用。

以下定義 IComparable 介面實作類別 ObjectElement 。
public class ObjectElement : IComparable
{
    private int _objectID;
    public ObjectElement(int objectID)
    {
        _objectID = objectID;
    }
    public int GetID
    {
        get
        {
            return _objectID;
        }
    }
    public int CompareTo(Object pObject)
    {
        ObjectElement oe = (ObjectElement)pObject;
        return _objectID.CompareTo(oe.GetID); 
    }

}
實作 CompareTo 方法接受一個 Object 物件型別參數 pObject ,將其鑄型成為 ObjectElement 型別,與本身的 _objectID 比較大小,以下撰寫程式以 ObjectElement 物件作為集合元素進行比較測試。
class Program
{
    static void Main(string[] args)
    {
        Program program = new Program();
        ArrayList arrayList = new ArrayList();
        Console.WriteLine
             ("新增二十個亂數值初始化 ObjectElement 物件,插入 arrayList … \n");

        Random r = new Random((new DateTime()).Millisecond);
        for (int i = 0; i < 20; i++)
        {
            int x = r.Next(0, 1000);
            arrayList.Add(new ObjectElement(x));
        }
        program.WriteList(arrayList);
        Console.WriteLine("引用 arrayList.Sort() 排列集合中物件順序 \n");
        arrayList.Sort();
        program.WriteList(arrayList);
        Console.ReadKey();
    }
    void WriteList(ArrayList arrayList)
    {
        for (int i = 0; i < arrayList.Count; i++)
        {
            ObjectElement myOE = (ObjectElement)arrayList[i];
            Console.Write(myOE.GetID + ",");
        }
        Console.WriteLine("\n");
    }
}
首先建立 ArrayList 物件,並將上述定義的 ObjectElement 物件當作元素,初始化以亂數取得的值設定為 _objectID ,執行各種元素操作,接下來引用 arrayList.Sort() 方法針對其中插入的ObjectElement 物件元素進行排序, ObjectElement 物件引用CompareTo 方法,依據其 _objectID 值重新排列元素在集合中的位置。
新增二十個亂數值初始化 ObjectElement 物件,插入 arrayList … 

877,396,703,838,774,867,546,880,631,187,459,197,715,767,758,371,849,474,795,987,

引用 arrayList.Sort() 排列集合中物件順序

187,197,371,396,459,474,546,631,703,715,758,767,774,795,838,849,867,877,880,987,
從輸出結果可以看到 Sort 方法,根據 _objectID 排列集合中ObjectElement 物件。

沒有留言: