List泛型集合對象排序


本文的重點主要是解決: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編寫邏輯:

  1. 確定好要排序的屬性和排序規則,為此寫一個排序類。
  2. 編寫Compare方法的排序邏輯(指定排序屬性,排序邏輯)。
  3. 創建排序類的對象,作為參數參入,調用Sort()方法。

 總結:本文主要是解決實際問題,要深入到細節原理,會涉及到一些知識點:冒泡排序、多態、比較器、委托。

   在具備知識點的前提結合Msdn文檔可以嘗試透析原理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM