C#中的List集合在排序的時候,如果不使用Lambda表達式進行排序的話,一般調用Sort()方法進行排序,如果希望Sort()方法排序後的結果跟我們預想的效果一致或者按照我們自定義的規則排序,則需要將對應的實體繼承IComparable介面來實現。 MSDN上給IComparable介面的定義為 ...
C#中的List集合在排序的時候,如果不使用Lambda表達式進行排序的話,一般調用Sort()方法進行排序,如果希望Sort()方法排序後的結果跟我們預想的效果一致或者按照我們自定義的規則排序,則需要將對應的實體繼承IComparable介面來實現。
MSDN上給IComparable介面的定義為:定義由值類型或類實現的特定於類型的通用比較方法,旨在對其實例進行排序,使自建類的數組可以使用Array. Sort方法進行排序。自建類繼承IComparable介面後,必須實現CompareTo方法,該方法參數是一個T類型的對象,返回值必須是-1,0,1中之一。
下麵以一個例子來講解這個自定義排序,我們定義一個Person人員類,該類包含Name和Age兩個屬性,要求在數組中調用Sort()方法排序的時候,按年齡Age屬性從小到大排序,相應的實現如下代碼所示:
class Person : IComparable { public Person(string name, int age) { Name = name; Age = age; } public string Name { get; set; } public int Age { get; set; } public int CompareTo(object obj) //實現該比較方法即可 { if (obj is Person) { Person p = obj as Person; return this.Age.CompareTo(p.Age); } else { throw new ArgumentException("Object to compare to is not a Person object"); } } }
然後我們寫個控制台程式測試下上述的排序結果,測試程式如下:
static void Main(string[] args) { List<Person> personlist = new List<Person>(); personlist.Add(new Person("馬六",89)); personlist.Add(new Person("張三",33)); personlist.Add(new Person("李四",3)); personlist.Add(new Person("王五", 244)); personlist.Sort(); foreach(Person p in personlist) { Console.Write("姓名:"+p.Name+" 年齡:"+p.Age); Console.Write("\n"); } Console.ReadKey(); }
運行之後,我們查看下輸出的結果信息,完美的達到了我們預期的效果,輸出的結果如下:
姓名:李四 年齡:3 姓名:張三 年齡:33 姓名:馬六 年齡:89 姓名:王五 年齡:244
備註:原文轉載自C#中自定義Sort的排序規則IComparable介面_IT技術小趣屋。