本文爲 C#高級編程(第十版) 讀書筆記,整理學過的知識,便於忘記後重新拾起。
通過IComparable接口實現自定義類的數組元素排序
- 通過繼承Icomparable接口實現類排序
Array類使用Quicksort算法對數組中的元素進行排序。Sort()方法需要數組中的元素實現Icomparable接口。
Icomparable接口只定義了一個方法CompareTo(),如果比較對象相等返回0,如果實例應該排在參數的前面返回小於0的值,否則返回大於0的值
示例:
//自定義類
public class Person{
public string FirstName;
public string LastName;
}
//拓展後的自定義類
Public class Person:IComparable<Person>
{
public string FirstName;
public string LastName;
public int CompareTo(Person other)
{
if(other==null){
return 1;
}
int result=string.Compare(this.LastName,other.LastName);
if(result==0){
result=string.Compare(this.FirstName,other.FirstName);
}
return result;
}
}
//使用
//聲明一個數組
Person[] persons={
....
....
}
//排序
Array.Sort(persons);
2.通創建一個新類IComparer繼承實現排序功能
如果Person對象的排序方式不同,或者不能修改在數組中作爲元素的類,那麼可以實現IComparer接口或IComparer接口。這兩個接口定義了Compare(),要比較的類必須實現這兩個接口之一。
代碼如下:
//用於比較的枚舉參數
public enum PersonCompareType
{
FirstName,
LastName.
}
//拓展Person比較功能的類
public class PersonComparer:IComparer<Person>
{
private PersonComparerType _compareType;
public PersonComparer(PersonComparerType comparerType)
{
_compareType=comparerType;
}
public int Compare(Person x,Persony)
{
if(x==null&&y==null)
{
return 0;
}
if(x==null)
{
return 1;
}
if(y==null)
{
return -1;
}
switch(_compareType)
{
case PersonCompareType.FirstName:
return string.Compaer(x.FirstName,y.FirstName);
case PersonCompareType.LastName:
return string.Compaer(x.LastName,y.LastName);
default:
throw new ArgumentException("unexpected compare type");
}
}
}
//使用
Array.sort(persons,new PersonComparer(PersonCompareType.FirstName));
3.通過委託參數實現排序功能(待補充…)
Array類還提供了Sort方法需要將一個委託作爲參數。這個參數可以傳遞給方法,從而不依賴IComparable或者ICmparer接口實現類的比較排序。