C#学习笔记,20——使用IComparer

说明(2017-7-25 10:38:37):

1. 参照了上一篇百度文库里的文章。

2. 总结来看,Icomparer就是sort方法的一个参数,用来自定义一个排序规则。

3. 使用方法是,定义一个排序类,如PersonComparer,继承Icomparer接口,实现里面的Icomparer方法,用的时候直接sort(new

PersonComparer())就可以了。

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

namespace _03IComparer用法
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Person> p = new List<Person>();
            p.Add(new Person("张三", 12));
            p.Add(new Person("李四", 23));
            p.Add(new Person("王五", 43));
            p.Add(new Person("赵六", 25));
            p.Add(new Person("钱七", 63));
            p.Add(new Person("孙八", 23));
            p.Add(new Person("孙九", 18));
            //排序前
            foreach (Person person in p)
            {
                person.SayHello();
            }
            Console.WriteLine("________________________");
            //按姓名排序,注意sort排序会改变原值!
            p.Sort(new PersonComparer(PersonComparer.CompareType.Name));
            foreach (Person person in p)
            {
                person.SayHello();
            }
            Console.WriteLine("________________________");
            //按年龄排序
            p.Sort(new PersonComparer(PersonComparer.CompareType.Age));
            foreach (Person person in p)
            {
                person.SayHello();
            }
            
            Console.ReadKey();
        }

    }
    //定义Person类
    class Person
    {
        public Person(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
        public string Name { get; set; }
        public int Age { get; set; }
        //这个地方很多文章用了“public override string ToString()”,重写了ToString方法,返回上面两个属性,我觉得没必要,搞得让人费解,还不如重新起个名,比如SayHello
        public void SayHello()
        {
            Console.WriteLine("我叫{0},今年{1}岁了!", this.Name, this.Age);
        }
    }

    //定义PersonComparer类,其实就是声明一个自定义的排序规则。此处的规则就是,按照名字排序,或者按照成绩排序。
    //sort方法,如果无参,使用默认比较器。另外可以使用IComparison,IComparer参数。
    class PersonComparer : IComparer<Person>
    {
        //定义枚举,方便传参,根据名字还是年龄排序。
        public enum CompareType
        {
            Name,
            Age
        }
        private CompareType type;
        public PersonComparer(CompareType type)
        {
            this.type = type;
        }
        //实现IComparer接口,里面就一个Compare函数,返回int类型
        //返回结果:一个带符号整数,它指示 x 与 y 的相对值。小于零,x小于y。零,x等于y。大于零,x大于y。
        public int Compare(Person x, Person y)
        {
            if (this.type == CompareType.Name)
            {
                return x.Name.CompareTo(y.Name);
            }
            else
            {
                return x.Age.CompareTo(y.Age);
            }
        }
    }
}