C#开发之——IComparable、IComparer接口(9.6)

一 概述

  • 在 C# 语言中提供了 IComparer 和 IComparable 接口比较集合中的对象值,主要用于对集合中的元素排序。

  • IComparer 接口用于在一个单独的类中实现,用于比较任意两个对象。

  • IComparable 接口用于在要比较的对象的类中实现,可以比较任意两个对象。

  • 在比较器中还提供了泛型接口的表示形式,即 IComparer<T> 和 IComparable<T> 的形式

<!--more-->

二 方法比较

编号接口方法作用
1IComparableCompareTo(T obj)比较两个对象值
2IComparerCompare(T obj1,T obj2)比较两个对象值

三 实例

3.1 实例一  将学生信息按照年龄从大到小输出 

3.1.1 分析

  • 根据题目要求,如果不使用比较器,由于集合中的元素是Student类型的,不能直接排序,需要按照Student学生信息类中的年龄属性排序,因此代码比较繁琐

  • 使用CompareTo方法实现比较简单。在Student类中添加CompareTo方法

3.1.2 代码

<span style="color:#333333">class Student:IComparable<Student>
{
    //提供有参构造方法,为属性赋值
    public Student(int id,string name,int age)
    {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    //学号
    public int id { get; set; }
    //姓名
    public string name { get; set; }
    //年龄
    public int age { get; set; }
    //重写ToString 方法
    public override string ToString()
    {
        return id + ":" + name + ":" + age;
    }
    //定义比较方法,按照学生的年龄比较
    public int CompareTo(Student other)
    {
        if (this.age > other.age)
        {
            return -1;
        }
        return 1;
    }
}
​
class Program
{
    static void Main(string[] args)
    {
        List<Student> list = new List<Student>();
        list.Add(new Student(1, "小明", 20));
        list.Add(new Student(2, "小李", 21));
        list.Add(new Student(3, "小赵", 22));
        list.Sort();
        foreach(Student stu in list)
        {
            Console.WriteLine(stu);
        }
    }
}</span>

3.1.2 执行结果

 

3.1.3 说明

  • 从上面的执行结果可以看出,在使用集合Sort方法后,集合中的元素是按照学生年龄从大到小的顺序输出的

  • 在默认情况下,Sort方法是将集合中的元素从小到大输出的,由于在Student类中重写了CompareTo方法,因此会按照预先定义好的排序规则对学生的信息排序

  • 需要说明的是,在CompareTo方法中返回值大于0则表示第一个对象的值大于第二个对象的值,返回值小于0则表示第一个对象的值小于第二个对象的值,返回值等于0则表示两个对象的值相等

3.2 实例二  用 IComparer<T> 接口实现 

3.2.1 代码

<span style="color:#333333">class Student
 {
     public int id { get; set; }//学号
     public string name { get; set; }//姓名
     public int age { get; set; }
     public Student(int id, string name, int age)
     {
         this.id = id;
         this.name = name;
         this.age = age;
     }
     public override string ToString()
     {
         return id+": "+name+": "+age;
     }
 }
 class MyCompare : IComparer<Student>
  {
      public int Compare([AllowNull] Student x, [AllowNull] Student y)
      {
         if (x.age > y.age)
          {
              return -1;
          }
          return 1;
      }
  }  
 class Program
  {
      static void Main(string[] args)
      {
          List<Student> list = new List<Student>();
          list.Add(new Student(1,"小明",20));
          list.Add(new Student(2,"小李",21));
          list.Add(new Student(3,"小赵",22));
          list.Sort(new MyCompare());
          foreach (Student stu in list)
          {
              Console.WriteLine(stu);
          }
      } 
  }</span>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值