天天看點

C#中IComparer和IComparable接口

本文介紹使用兩個接口,IComparer和IComparable。在相同的環境下面讨論這兩個接口。其一:這些常用在一起,雖然接口很相似,但是兩者卻提供不同的用途。其二:如果有數組類型 (如 字元串 或 整數 ) 已經支援 IComparer , 則不提供任何顯式引用到 IComparer 可排序該數組。 數組的元素此時, 都轉換為 IComparer ( Comparer.Default ) 的預設實作對。 但是, 如果要提供排序或比較功能對于您自定義對象, 必須實作任一或兩個這些接口。

ICmparable

class Person:IComparable

    {

        public int ID;

        public string Rank;

        //構造函數,初始化時就會分析

        public Person(int id,string rank)

        {

            this.ID = id;

            this.Rank = rank;

        }

        public int CompareTo(object obj)

        {

            Person person = (Person)obj;

            return this.ID.CompareTo(person.ID);

        }

    }

class Program

    {     

        static void Main(string[] args)

        {

            ArrayList list = new ArrayList();

            list.Add(new Person(6,"排長"));

            list.Add(new Person(3,"團長"));

            list.Add(new Person(4,"司令"));

            list.Add(new Person(5,"旅長"));

            list.Add(new Person(7,"連長"));

            list.Add(new Person(1,"軍長"));

            list.Add(new Person(2,"營長"));

            list.Add(new Person(8,"班長"));

            list.Sort();

            Console.WriteLine("After sorting!");

            foreach(Person person in list)

            {

                Console.WriteLine("ID:"+person.ID.ToString()+",Rank:"+person.Rank);

            }

        }

    }

輸出的結果為:

After sorting!

ID:1,Rank:軍長

ID:2,Rank:營長

ID:3,Rank:團長

ID:4,Rank:司令

ID:5,Rank:旅長

ID:6,Rank:排長

ID:7,Rank:連長

ID:8,Rank:班長

IComparer

角色的 IComparer 旨在提供其他比較機制。 例如, 您可能希望提供排序是按幾個字段或屬性, 類升序和降序對同一字段, 或兩者

使用 IComparer 是一個兩步過程。 首先, 聲明類實作 IComparer , 并然後實作 Compare 方法:

private class sortYearAscendingHelper : IComparer

{

int IComparer.Compare(object a, object b)

{

car c1=(car)a;

car c2=(car)b;

if (c1.year > c2.year)

return 1;

if (c1.year < c2.year)

return -1;

else

return 0;

}

}      

注意 IComparer.Compare 方法要求第三級比較。 1, 0 或 - 1 是傳回根據一個值是大于、, 等于或小于另一個。 通過此方法中切換邏輯運算符更改排序次序 (升序或降序)。

第二步是要傳回您 IComparer 對象的一個執行個體方法聲明:

public static IComparer sortYearAscending()

{

return (IComparer) new sortYearAscendingHelper();

}

       

使用 IComparer 不僅限于數組。 它被接受多種不同集合和控件類中以參數形式。

繼續閱讀