比较和排序 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);

        }

 

你可能感兴趣的:(comparable)