在.net framework中,數組和集合都實現了用於排序的方法sort(),數組通過調用Array.Sort(數組名)排序,集合通過調用 集合對象.Sort()方法排序。
默認的排序是使用升序排列,並且只能針對基本的數值類型排序,因為數值類型默認實現了對兩個值比較的接口。但如果是引用類型需要排序,則此引用類型
需要實現IComparable接口,實現接口中的CompareTo()方法用於比較兩個對象。
與比較和排序有關的接口有四個:非范型版本IComparable和IComparer,范型版本IComparable<T>和IComparer<T>
IComparable接口的主要目的是在需要比較和排序的類中實現CompareTo()方法,用於定義此類的2個對象比較的時候的默認的比較規則。
IComparer接口的主要目的是使某個繼承此接口的類實現Comapre()方法,在此方法中定義兩個對象的比較規則。此類就可以作為Sort()函數的參數,用於
在排序的時候作為比較和排序的規則。
例如:如果我們有一個學生類Student,有4個字段:int ID;Name;Score;如果有一個學生數組或學生集合,此集合需要排序。
則我們要做的工作為:
1.使Student能被比較和排序,就要實現IComparable接口,在CompareTo()方法中定義默認的排序規則,例如升序。
2.如果要實現降序,則我們需要定義一個類,此類實現IComparer接口,在Compare()中定義另外一種比較和排序的規則,例如降序。
3.調用Sort()方法實現排序,此方法可以不帶參數,按默認規則排序,也可以把實現了IComparer的接口的類的對象作為參數,這樣排序時將按照
另外一種規則排序。
下面示例演示了按升序或降序對一個Student類的數組或集合進行了排序:
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { //同時實現了范型和非范型的IComparable public class Student:IComparable,IComparable<Student> { public int ID; public string Name; public int Score; public Student(int id, string name, int score) { this.ID = id; this.Name = name; this.Score = score; } public string Info() { return string.Format("學號:{0,-5}姓名:{1,-5}分數:{2}",ID,Name,Score); } int IComparable.CompareTo(object obj) { return this.Score.CompareTo((obj as Student).Score); } int IComparable<Student>.CompareTo(Student other) { return this.Score.CompareTo(other.Score); } } //實現了非范型的IComparer接口 public class ReverseCompareClass : IComparer { int IComparer.Compare(object x, object y) { return ((new CaseInsensitiveComparer()).Compare(y, x)); } } //實現了范型的IComparer接口 public class StuReverseCompareClass : IComparer<Student> { int IComparer<Student>.Compare(Student x, Student y) { return y.Score.CompareTo(x.Score); } } class Program { static void Main(string[] args) { ArrayList stu = new ArrayList(); //List<Student> stu = new List<Student>(); int i; Random r = new Random(); for (i = 0; i < 10; i++) { stu.Add( new Student(i,i.ToString(),r.Next(60,90))); } //如果使用非范型集合,我們就在sort()中使用非范型的比較類 stu.Sort(new ReverseCompareClass()); //如果使用范型集合,我們就在sort()中使用范型的比較類 //stu.Sort(new StuReverseCompareClass()); for (i = 0; i < 10; i++) { Console.WriteLine((stu[i] as Student).Info()); //Console.WriteLine(stu[i].Info()); } Console.Read(); } } }
使用范型的好處是:類型安全,效率高,因為不存在裝箱和拆箱操作。