zoukankan      html  css  js  c++  java
  • 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文档可以尝试透析原理。

  • 相关阅读:
    带你梳理Roach全量恢复的整体流程
    为AR&VR黑科技:以“自由视角”360度尽展舞台唯美
    一个15年的架构师谈“如何成为一名优秀的解决方案架构师”
    SARIF:DevSecOps工具与平台交互的桥梁
    “蚂蚁牙黑”太火,想玩就用ModelArts做一个!
    图神经网络,这到底是个什么?
    Python 面向对象进阶
    Python 装饰器
    SQL 存储过程中事务回滚
    python 迭代器协议和生成器
  • 原文地址:https://www.cnblogs.com/green-jcx/p/9056353.html
Copyright © 2011-2022 走看看