IComparable与IComparer

本文详细介绍了如何对集合进行排序,包括使用内置的IComparable接口和自定义实现,以及如何通过继承IComparer接口创建比较器来实现特定的排序逻辑。文章以Person类为例,演示了如何按照年龄或名字长度进行排序,并展示了定义比较器来实现自定义排序的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.当我们要对集合进行排序时,集合中的元素必须要是一类元素,且元素的类型实现了IComparable接口

            ArrayList arr = new ArrayList() { 0, 8, 32, 4, 2, 432, 5, 234, 54323, 875, 45 };
            arr.Sort();
            for (int i = 0; i < arr.Count; i++)
            {
                Console.Write("{0} ",arr[i]);
            }
            Console.ReadKey();

结果是:

...............................................................

0 2 4 5 8 32 45 234 432 875 54323

这是因为int类型继承了IComparable接口,因此可以排序



2.那么我们是否可以为自定义的类型进行排序呢,答案是一定的

我们想为Person这个类按照某种条件进行排序,那么首先它必须实现Icomparable接口,以及实现这个接口中的方法CompareTo

 class Person : IComparable
  {
        public string Name { get; set; }
        public int Age { get; set; }


        public int CompareTo(object obj)
        {
            Person p = obj as Person;
            if (p == null)
            {
                throw new ArgumentException();
            }
            else
            {
                return this.Age-p.Age;
                //return this.Name.Length - p.Name.Length;
            }
        }
   }
按照年龄进行升序排序
ArrayList arr = new ArrayList() {
            new Person(){ Name="Alice Wang", Age=19},
            new Person(){ Name="Wayen Li", Age=12},
            new Person(){ Name="Chris Sun", Age=21},
            new Person(){ Name="Jerry Huang", Age=22}
            };

            Console.WriteLine("排序之前:");
            for (int i = 0; i < arr.Count; i++)
            {
                Console.WriteLine(((Person)arr[i]).Name);
            }
            //IComparable
            //升序排序
            arr.Sort();

            Console.WriteLine("排序之后:");
            for (int i = 0; i < arr.Count; i++)
            {
                Console.WriteLine(((Person)arr[i]).Name);
            }
            Console.ReadKey();

结果是:

.........................................................................

Wayen    Li
Alice     Wang
Chris    Sun
Jerry    Huang

如果按照名字的长度进行排序的话,结果是

.........................................................................

Wayen    Li
Chris     Sun
Alice     Wang
Jerry    Huang

3.我们也可以定义一个类,继承自IComparer接口,用作比较器

    class Person 
    {
        public string Name { get; set; }

        public int Age { get; set; }
    }


    class PersonSortByAgeAsc : IComparer
    {

        #region IComparer 成员
        public int Compare(object x, object y)
        {
            Person p1 = x as Person;
            Person p2 = y as Person;
            if (p1 != null && p2 != null)
            {
                return p1.Age - p2.Age;
            }
            else
            {
                throw new ArgumentException();
            }
        }
        #endregion
    }
按年龄大小进行升序排列

            ArrayList arr = new ArrayList() {
            new Person(){ Name="Alice Wang", Age=19},
            new Person(){ Name="Wayen Li", Age=12},
            new Person(){ Name="Chris Sun", Age=21},
            new Person(){ Name="Jerry Huang", Age=22}
            };
 //按照年龄升序排序
            arr.Sort(new PersonSortByAgeAsc());

            for (int i = 0; i < arr.Count; i++)
            {
                Console.WriteLine(((Person)arr[i]).Name);
            }
           Console.ReadKey();
结果是:

.........................................................................

Wayen    Li
Alice     Wang
Chris    Sun
Jerry    Huang

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值