輸出結果:
4 5 6 5 7
108 100 101 103 103
4 5 5 6 7
100 101 103 103 108
輸出顯示整型數組和Employee數組產生的是隨機數。排序後,顯示的是已經進行排序後的值。
9.6.2 實現IComparer接口
當您在List中調用Sort(),默認的IComparer(譯者注:這裡可能是錯誤,應該為IComparable)實現被調用,它調用IComparable所實現的CompareTo()方法對List內的每個元素進行快速排序。
當您想控制排列方式時,可以自由地創建自己的IComparer實現。在下一個例子中,將在Employee中添加第二個字段:yearsOfSvc。您希望在List中按兩種字段empID或yearsOfSvc來對Employee對象進行排序。
為了達到這個目的,需要創建IComparer的實現,用於傳遞給List中Sort()方法的參數。這個IComparer類是EmployeeComparer,它讓Employee對象知道如何進行排序。
EmployeeComparer類有一個WhichComparison屬性,它是Employee. EmployeeComparer.ComparisonType類型:
public Employee.EmployeeComparer.ComparisonType WhichComparison
{
get{return whichComparison;}
set{whichComparison = value;}
}
ComparisonType是一個枚舉類型,它有兩個值:empID或yearsOfSvc(指示您希望按員工ID還是工齡進行排序):
public enum ComparisonType
{
EmpID,
YearsOfService
};
在調用Sort()方法之前,創建EmployeeComparer的實例並設置它的ComparisonType屬性:
Employee.EmployeeComparer c = Employee.GetComparer();
c.WhichComparison=Employee.EmployeeComparer.ComparisonType.EmpID;
empArray.Sort(c);
調用Sort()方法之時,List會調用EmployeeComparer中的Compare方法,並把當前要對比的字段通過WhickComparison屬性傳遞給Employee.CompareTo()方法:
public int Compare( Employee lhs, Employee rhs )
{
return lhs.CompareTo( rhs, WhichComparison );
}
Employee對象必須實現一個自定義的CompareTo()方法,用於獲得比較方式並按照要求進行對比:
public int CompareTo(Employee rhs,
Employee.EmployeeComparer.ComparisonType which)
{
switch (which)
{
case Employee.EmployeeComparer.ComparisonType.EmpID:
return this.empID.CompareTo(rhs.empID);
case Employee.EmployeeComparer.ComparisonType.Yrs:
return this.yearsOfSvc.CompareTo(rhs.yearsOfSvc);
}
return 0;
}