本文的重點主要是解決:List<T>對象集合的排序功能。 一、List<T>.Sort 方法 () MSDN對這個無參Sort()方法的介紹:使用預設比較器對整個List<T>中的元素進行排序。 從官方文檔的介紹,很難的看出詳細的解析,而且還要完整的知識結構去分析,上面提到了一個關鍵詞:比較器。大致 ...
本文的重點主要是解決:List<T>對象集合的排序功能。
一、List<T>.Sort 方法 ()
MSDN對這個無參Sort()方法的介紹:使用預設比較器對整個List<T>中的元素進行排序。
從官方文檔的介紹,很難的看出詳細的解析,而且還要完整的知識結構去分析,上面提到了一個關鍵詞:比較器。大致看了下,比較器是一個委托。在這裡不去透析它的完整脈絡,本文只去講解怎麼去解決兩個實際的問題:
- List集合元素升序排列
- List集合元素降序排列
1.1.對於數字類型的調用
調用結果:為升序,無法滿足降序。
示例:
1.2.對於字元串類型的調用
調用結果:把值解析成拼音字母,按照首個英文字母順序升序排列,如果首字母相同,比較第二個的首字母。
示例:
1.3.對於自定義對象的調用
調用結果:無法完成方法的執行,運行報錯。
示例:
總結:很顯然這個無參的Sort()方法很難滿足我們實際開發中需求,對於面向對象編程我們,常常就是對集合中的對象進行排序。
二、自定義對象類型預設排序
對象本身不是一個具體的值,在排序邏輯上顯然要選擇對象的一個屬性進行排序。
1.1手動設置無參Sotr()方法的預設排序邏輯
將List的指定類型的類實現IComparable泛型介面,示例:
1 class Student:IComparable<Student> 2 { 3 4 public string Id { get; set; } 5 public string Name { get; set; } 6 public int Age { get; set; } 7 8 public int CompareTo(Student other) 9 { 10 //return other.Age.CompareTo(this.Age); // 年齡降序 11 return this.Age.CompareTo(other.Age); // 年齡升序 12 } 13 }
排序邏輯:this在前面就意味著指定按照這個屬性升序,如果寫在後面就是降序。
調用:
List<Student> list_obj = new List<Student> { new Student { Age=23,Name="tom"}, new Student { Age=18,Name="jack"}, new Student {Age=28, Name="bob"}, }; list_obj.Sort(); for (int i = 0; i < list_obj.Count; i++) { string output_result = string.Format("{0},年齡:{1}",list_obj[i].Name,list_obj[i].Age); Console.WriteLine(output_result); }
在調用Sort()方法的時候,就自動調用了我們實現介面的CompareTo方法的邏輯代碼。
結果如圖:
總結:此方法的實現,雖然解決了可以按照對象屬性進行升序和降序,但是在實現CompareTo的方法里,指定的屬性是固定的。這樣的話顯然
不靈活,那麼下麵就介紹另一種方法,解決該問題。
二、自定義對象類型動態排序
預設排序,通過實現IComparable泛型介面來完成。並且在實現ComparaTo介面里指定排序的屬性是固定的,寫死的。如果功能上有多條件排序(按照年齡、學號等等),預設排序就無法滿足。
1.1為每一個要排序的屬性寫一個對應的排序類,一個排序邏輯對應一個排序類,示例:
//按照Id升序 class StudentOrderBy_Id_asc:IComparer<Student> { public int Compare(Student x, Student y) { return x.Id.CompareTo(y.Id); } } //按照年齡降序 class StudentOrderBy_Age_desc:IComparer<Student> { public int Compare(Student x, Student y) { return y.Age.CompareTo(x.Age); } }
1.2.調用
List<Student> list_obj = new List<Student> { new Student { Id=9,Age=23,Name="tom"}, new Student { Id=3,Age=18,Name="jack"}, new Student {Id=10,Age=28, Name="bob"}, new Student {Id=2,Age=30, Name="ben"}, }; //---按照ID升序---- list_obj.Sort(new StudentOrderBy_Id_asc()); Console.WriteLine("---按照ID升序----"); for (int i = 0; i < list_obj.Count; i++) { string output_result = string.Format("{0},學號:{1}",list_obj[i].Name,list_obj[i].Id); Console.WriteLine(output_result); } //---END按照ID升序---- //---按照年齡降序---- list_obj.Sort(new StudentOrderBy_Age_desc()); Console.WriteLine("---按照年齡降序----"); for (int i = 0; i < list_obj.Count; i++) { string output_result = string.Format("{0},年齡:{1}", list_obj[i].Name, list_obj[i].Age); Console.WriteLine(output_result); } //---END按照年齡降序----
1.3.輸出結果:
1.4編寫邏輯:
- 確定好要排序的屬性和排序規則,為此寫一個排序類。
- 編寫Compare方法的排序邏輯(指定排序屬性,排序邏輯)。
- 創建排序類的對象,作為參數參入,調用Sort()方法。
總結:本文主要是解決實際問題,要深入到細節原理,會涉及到一些知識點:冒泡排序、多態、比較器、委托。
在具備知識點的前提結合Msdn文檔可以嘗試透析原理。