1、基本數據類型的泛型(int,double ,string等)直接調用sort函數排序即可
List<string> NameLst = new List<string>() { "asdf","aered"};
NameLst.Sort();
通過調用集合的Reverse()可實現反轉
2、對象型泛型排序
Goat 是類,Goat1,Goat2是類的實例,
class Goat
{
private string _name;
private int _age;
public string Name
{
get { return _name; }
}
public int Age
{
get { return _age; }
}
public Goat(string Name)
{
_name = Name;
}
..........................
}
List<Goat> GoatLst = new List<Goat>() {Goat1,Goat2 };
如果直接調用GoatLst .sort() 會報錯:未能比較數組中的兩個元素。因爲不知道不知道按照什麼進行排序
對象型排序可以通過排序接口 按照對象的某個基本類型的成員進行排序。
類的聲明需要繼承比較接口
class Goat:IComparable<Goat> //泛型比較接口
在vs中Alt + Enter 可看到實現接口和顯示實現接口。
點擊實現接口 ,自動生成CompareTo函數。
public int CompareTo(Goat other)
{
//在此函數中實現排序
//降序
return other.Name.CompareTo(this.Name);
//升序 return this.Name.CompareTo(other.Name);
}
然後調用GoatLst .sort() 就會直接調用CompareTo函數,也就是通過
Name字段進行排序
點擊 顯示實現接口 生成的函數如下
區別在於:當有繼承了多個接口或類,且不止一個接口 或類中有CompareTo這個函數,需要通過接口或類名來進行顯示
區分具體調用的是那個接口的CompareTo函數。比較的代碼與實現接口一樣
int IComparable<Goat>.CompareTo(Goat other)
{
throw new NotImplementedException();
}
缺點:排序接口一個類中只能實現一個比較方法。
上例中實現了通過Name字段進行排序,如果還希望添加通過age排序,
就需要使用接下來介紹
的方法。
3、動態排序
通過繼承 IComparer 的排序類實現
步驟一,實現排序類, 如下聲明實現了4個排序類
class GoatNameASC : IComparer<Goat>//升序排name
{
public int Compare(Goat x, Goat y)
{
return x.Name.CompareTo(y.Name);
}
}
class GoatNameDES : IComparer<Goat>//降序排name
{
public int Compare(Goat x, Goat y)
{
return y.Name.CompareTo(x.Name);
}
}
class GoatAgeASC : IComparer<Goat>//升序排age
{
{
public int Compare(Goat x, Goat y)
{
return x.Age.CompareTo(y.Age);
}
}
class GoatAgeDES : IComparer<Goat>//降序排age
{
public int Compare(Goat x, Goat y)
{
return y.Age.CompareTo(x.Age);
}
}
第二步:調用
List<Goat> GoatLst = new List<Goat>() {Goat1,Goat2 };
GoatLst.Sort(new GoatAgeASC());//age升序排
GoatLst.Sort(new GoatAgeDES());//age降序排
GoatLst.Sort(new GoatNameASC());//name升序排
GoatLst.Sort(new GoatNameDES());//name降序排