【c#高級編程】數組和元組:通過IComparable接口實現自定義類的數組元素排序

本文爲 C#高級編程(第十版) 讀書筆記,整理學過的知識,便於忘記後重新拾起。

通過IComparable接口實現自定義類的數組元素排序

  1. 通過繼承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接口實現類的比較排序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章