C# sort 方法詳解及示例
諸如List<T>等泛型集合類,直接提供了sort()方法用於將集合中的元素進行排序。
但是,其前提是集合中存放的是可直接排序的基本型別,如List<int>, List<double>,如果
我們定義了一個自定義型別 Class MyClass,並建立一個自定義型別的集合如List<MyClass>,
那麼無參的sort()方法就不可用了,因為不知道如何排序了。這時就需要藉助:
IComparer 和 IComparable
首先,我們來看一下c#泛型List提供的Sort方法:
泛型List類的Sort方法有四種形式,分別是
1,不帶有任何引數的Sort方法----Sort();
2,帶有比較器引數的Sort方法 ----Sort(IComparer<T>)
3,帶有比較代理方法引數的Sort方法----Sort(Comparison<(Of <(T>)>))
4,帶有比較器引數,可以指定排序範圍的Sort方法----Sort(Int32, Int32 IComparer(T))
【解析:】第一種方法
使用這種方法不是對List中的任何元素物件都可以進行排序,List中的元素物件必須繼承IComparable介面,並且要實現IComparable介面中的CompareTo()方法,在CompareTo()方法中要自己實現物件的比較規則。
例如,Int32和Double都是實現了IComparable介面並重載了CompareTo方法的結構。(注:int和double都是Int32和Double的別名(alias))
【解析:】第二種方法
2,帶有比較器引數的Sort方法 ----Sort(IComparer<T>),
1)建立一個額外的比較器類:其實就相當於將排序功能中的比較操作,留個使用者來完成。這個比較操作必須在實現了IComparer介面的自定義比較類中完成;如:
class myComparer:IComparer<MyClass>
2)制定比較規則實現比較方法:因為介面中有一個用於比較的過載函式Compare,所在在比較器類中我們必須實現它,完成自己希望的比較。所謂自己希望的比較就是說自己實現自定義物件的比較規則,例如你知道自定義類MyClass中哪個屬性適合用來排序,那麼就選擇這個屬性作為整個自定義類物件的排序屬性,如該類中有年齡,學號,入學日期等屬性,你可以選擇年齡屬性作為排序屬性。如:
public class myComparer:IComparer<MyClass>
{
//實現按年齡升序排列
public int Compare(MyClass x, MyClass y)
{
return (x.age.CompareTo(y.age)); //age代表年齡屬性是整型,即其已支援CompareTo方法
}
}
3)使用比較器的排序方法呼叫:然後,在自定義型別的集合如List<MyClass> myList,上就可以進行sort排序了,如
myList.Sort(new myComparer());
【解析:】第三種方法
3,帶有比較代理方法引數的Sort方法----Sort(Comparison<(Of <(T>)>))
Comparison<(Of <(T>)>是一種泛型委託。所以,需要編寫一個物件排序比較的方法,對List中的元素物件沒有特殊的要求,但在比