欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【转载】C#中自定义Sort的排序规则IComparable接口

程序员文章站 2022-07-11 09:59:26
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技术小趣屋