本文介紹使用兩個接口,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 不僅限于數組。 它被接受多種不同集合和控件類中以參數形式。