比较和排序 IComparable And IComparer

1.List<Student>默认排序

为类创建默认排序实现IComparable,此代码的实现为年龄升序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IComparable_And_IComparer.Model
{
    /// <summary>
    /// 学生类
    /// </summary>
    /*
     如果需要对类进行排序,那么我们需要实现IComparable接口中的CompareTo比较方法
     */
    public class Student : IComparable<Student>
    {
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { get; set; }
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 学号
        /// </summary>
        public string No { get; set; }

        /*
        需要注意的是此比较方法为
        :本身对象与另一对象做比较
            如果返回为大于等于1:则认为本身对象(this)应排列在后
            如果返回为小于等于-1:则认为本身对象应排列在前(0开始为前)
            如果返回为等于0:则认为此对象本身比较对象位置不变
        所以可以根据此方式去实现升序和降序

        如果只是使用,只要记住 this.xxx.CompareTo(other.xxx)为升序;other.xxx.CompareTo(this.xxx)为降序 

        以下内容(可无视)

        均为钻牛角尖思考:
        理解说明:由于所有元素都会进行比较,都会以this进行比较,
         * (升序)所以如果需要大的排在后面 我们只需要CompareTo返回时规定如果本身大于比较的值(也就是说如果我们选择 本身减去比较 那么表示我们需要本身大于比较的值排在后面){ 因为如果本身是大于的话,那么值就会排到后面,小于的话值就会到前面去}
         * (降序)所以如果需要大的排在后面 我们只需要CompareTo返回时规定如果本身小于比较的值
         *
         *
         * 

         初略辅助理解:因为最终所有元素都会进行比较(也就是所有元素都会成为this)
         * 如果是this.Age.CompareTo(other.Age);
         *  因为
         *      如果本身大于比较的值,那么则会到后面去
         *      小于则排到前面去
         *  而因为认为所有元素都会成为this所以所有元素大的都会到后面去
        */
        /// <summary>
        /// 实现排序
        /// </summary>
        /// <param name="other">比较的对象</param>
        /// <returns>
        /// 等于0:相等  (表示与做比较的对象相等);
        /// 大于等于1:大于(表示大于比较的对象);
        /// 小于等于-1:小于(表示小于比较的对象);
        /// </returns>
        public int CompareTo(Student other)
        {
            //if (this.Age > other.Age)
            //    return 1;
            //else if (this.Age == other.Age)
            //    return 0;
            //else
            //    return -1;

            //return this.Age - other.Age;       //本身大于比较的对象,排于后面
            return this.Age.CompareTo(other.Age);//希望大于的排在后面(升序)
            //return this.Age.CompareTo(other.Age);//希望小于的排在后面(降序)
        }
    }
}

使用:

List<Student> list= new List<Student>()
                {
                    new Student() { Age = 2, Name = "B", No = "A002" },
                    new Student() { Age = 1, Name = "A1", No = "A001" },
                    new Student() { Age = 3, Name = "A2", No = "A0010" },
                    new Student() { Age = 5, Name = "A3", No = "A0015" },
                    new Student() { Age = 6, Name = "A4", No = "A0016" },
                    new Student() { Age = 10, Name = "A5", No = "A0011" },
                    new Student() { Age = 11, Name = "A9", No = "A0012" },
                    new Student() { Age = 12, Name = "A11", No = "A0013" },
                    new Student() { Age = 31, Name = "A12", No = "A0014" },
                 };

list.Sort();

2.List<Student> 使用自定义排序比较器实现多种排序方式(需要多少种排序方式就需要定义多少个类去实现接口):实现IComparer接口

using IComparable_And_IComparer.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IComparable_And_IComparer.SortComparer
{
    /// <summary>
    /// 有泛型的接口,应该明确表明类型,否则为object
    ///     会造成拆箱与装箱问题
    /// </summary>
    public class NameASC : IComparer<Student>
    {
        /// <summary>
        /// 相关注释描述参考Student类,Student类中this为此方法中x
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public int Compare(Student x, Student y)
        {
            return x.Name.CompareTo(y.Name);
        }
    }
}

使用:

list.Sort(new NameASC());

3.linq动态排序

       if (true)
                list = (from p in list
                        //orderby 后面需要接上值,来让其为每条数据作比较
                        orderby GetPropertyValue(p, txtFieldOrder.Text) ascending
                        select p).ToList();
            else
                list = (from p in list
                        //orderby 后面需要接上值,来让其为每条数据作比较
                        orderby GetPropertyValue(p, txtFieldOrder.Text) descending
                        select p).ToList();

     /// <summary>
        /// 获取一个对象的属性值
        /// </summary>
        /// <param name="obj">对象</param>
        /// <param name="property">属性名</param>
        /// <returns></returns>
        private static object GetPropertyValue(object obj, string property)
        {
            System.Reflection.PropertyInfo propertyInfo = obj.GetType().GetProperty(property);
            return propertyInfo.GetValue(obj, null);
        }
时间: 2025-01-03 18:14:05

比较和排序 IComparable And IComparer的相关文章

比较和排序:IComparable和IComparer

创建实体类,如Person,默认按照年龄进行排序,则需要为实体类实现IComparable接口. class Person : IComparable { public string Name { get; set; } public int Age { get; set; } public override string ToString() { return string.Format("Name : {0} ; Age : {1} .", this.Name, this.Age)

比较和排序(IComparable和IComparer以及它们的泛型实现)

本文摘要: 1:比较和排序的概念: 2:IComparable和IComparer: 3:IComparable和IComparer的泛型实现IComparable<T>和IComparer<T>: 1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如string提供了按字母进行比较,int提供了按整数大小进行比较. 2:ICompara

C# 中的IComparable和IComparer

前言 在开发过程中经常会遇到比较排序的问题,比如说对集合数组的排序等情况,基本类型都提供了默认的比较算法,如string提供了按字母进行排序,而int整数则是根据整数大小进行排序.但是在引用类型中(具有多个字段),那么这个排序当然也是取决于我们特定的值. IComparable接口 该接口由其值可以排序或排序的类型实现,并提供强类型的比较方法以对泛型集合对象的成员进行排序,例如数字可以大于第二个数字,一个字符串可以在另一个字符串之前以字母顺序出现.他要求实现类型定义的一个方法,CompareTo

对象的比较与排序:IComparable和IComparer接口

IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下: 1. IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象. 2. IComparer 在一个单独的类中实现,可以比较任意两个对象. 先看 IComparable 这个接口方法是 int CompareTo(object obj); 方法只有一个参数,我们知道比较至少要有两个对象,所以这个方法

C# 常用接口学习 IComparable 和 IComparer

作者:乌龙哈里 时间:2015-11-01 平台:Window7 64bit,Visual Studio Community 2015 参考: Microsoft Refernce Souce MSDN 章节: 接口 IConmparable 实现 接口 IComparable<T> 实现 接口 IComparer<T> 实现 正文: 一.接口 IConmparable 的实现 class Fruit {     public string Name;     public int

C# 用实例来理解IComparable和IComparer

通过Array的Sort方法来理解的 Sort方法要 通过对象去继承IComparable接口来实现排序(当然也有其它办法),我想入门这可能就是对这句话有点不理解,在下面会有注释 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections; namespace ConsoleApplication1{ /// <summary> /// 设置

IComparable和IComparer接口

C#中,自定义类型,支持比较和排序,需要实现IComparable接口.IComparable接口存在一个名为CompareTo()的方法,接收类型为object的参数表示被比较对象,返回整型值:1表示当前对象大于被比较对象,0表示两者相等,-1表示当前对象小于被比较对象. public int CompareTo(object o) {} 若想以更加灵活的方式对自定义类进行比较,可以声明一个继承自IComparer接口的比较器,实现接口方法Comprae(),接收2个object类型参数作为比

IComparable和IComparer

using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace no._1 { class Program { static void Main(string[] args) { ArrayList arr1 = new ArrayList() { new P

IComparable和IComparer接口的简析

默认情况下,对象的Equals(object o)方法是比较两个对象是否引用同一个对象.如果我们有自己的对象,就要自己定义对象比较方式: 1.IComparable在要比较的对象(类的实例化就是对象)类中实现,可以比较该对象和另一个对象. 2.IComparer在一个单独的类中实现,可以任意比较两个对象. 通俗的讲,IComparable是能够比较,具备比较的能力.比如说某个人具备编程的能力,如果需要对编程能力的高低进行比较的话,就必须在自己的类中去实现怎么具体的方法.IComparer是比较者