Icomparer和Icomparable集合排序

c#中实现对象集合的排序可以使用ArrayList中的Sort()方法,而有比较才能谈排序,因为不是基本类型(如string ,int.double......等)所以.NET Framework不可能一一制定他们的比较规则,那么则需要程序员自行制定,而比较规则的制定就需要通过继承这两个接口>之一来实现。制定了比较规则后则才可以用以下两种方式之一调用排序:
(1)ArrayList实例.Sort(); // IComparable
(2)ArrayList实例.Sort(实现Icomparer接口的类); // Icomparer

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

namespace Demo3
{
    class Program
    {
        static void Main(string[] args)
        {
            //新建集合people用来存放person实例
            ArrayList people = new ArrayList();
            //建立4个person实例
            Person person1 = new Person("Jone", 18);
            Person person2 = new Person("Tom", 20);
            Person person3 = new Person("Lily", 15);
            Person person4 = new Person("July", 25);
            //将实例添加到people集合中
            people.Add(person1);
            people.Add(person2);
            people.Add(person3);
            people.Add(person4);
            //输出原来序列
            Console.WriteLine("原来序列:");
            foreach (Person person in people)
            {
                Console.WriteLine("person name: {0}  age:{1}", person.Name, person.Age);
            }
            //用实现Icomparable进行排序
            people.Sort();
            //用实现Icomparable的方法输出排序后的序列
            Console.WriteLine("按年龄排序后的序列:");
            foreach (Person person in people)
            {
                Console.WriteLine("person name: {0}  age:{1}", person.Name, person.Age);
            }
            //用实现Icomparer的方法进行排序
            people.Sort(PersonComparer.Default);
            //用实现Icomparer的方法输出排序后的序列
            Console.WriteLine("按名称排序后的序列:");
            foreach (Person person in people)
            {
                Console.WriteLine("person name: {0}  age:{1}", person.Name, person.Age);
            }
            Console.ReadKey();
        }
    }

    public class Person : IComparable
    {
        /// <summary>
        /// 两个私有字段:
        /// 人物姓名;
        /// 人物年龄;
        /// </summary>
        private string name;
        private int age;


        /// <summary>
        /// 构造函数
        /// </summary>
        public Person(string myname, int myage)
        {
            name = myname;
            age = myage;
        }

        /// <summary>
        /// 两个共有属性:
        /// 分别对应两个私有字段;
        /// </summary>
        public string Name
        {
            set
            {
                name = value;
            }
            get
            {
                return name;
            }
        }
        public int Age
        {
            set
            {
                age = value;
            }
            get
            {
                return age;
            }
        }

        public int CompareTo(object myobject)
        {
            if (myobject is Person)//用is运算符判断要比较的对象是否是Person对象
            {
                //如果是用as运算符进行对象转换,返回年龄比较结果(一个整数,表示两者差)
                Person myperson = myobject as Person;
                return this.Age - myperson.Age;
                //return myperson.Age - this.Age;
            }
            else
            {
                //如果不是,抛出异常
                throw new ArgumentException("Object to compare to is not a Person Object");
            }
        }
    }

    public class PersonComparer : IComparer
    {
        //静态字段,方便使用,没有也可,调用方法会变
        public static IComparer Default = new PersonComparer();
        public int Compare(object myperson1, object myperson2)
        {
            //用is运算符判断要比较的对象是否都是Person对象
            if (myperson1 is Person && myperson2 is Person)
            {
                //如果是,调用.Net Framework已经实现好的能比较基本类型的函数:Comparer.Default.Compare
                //(要用using System.Collections;)
                return Comparer.Default.Compare(((Person)myperson1).Name, ((Person)myperson2).Name);
            }
            else
            {
                //如果不是抛出异常
                throw new ArgumentException("One or both objects to compare are not Person objects.");
            }
        }
    }
}

422101-20170502161305461-1579343863.png

方法论:读书加上网查询相关资料,能够更好的理解知识点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值