一 概述
-
在 C# 语言中提供了 IComparer 和 IComparable 接口比较集合中的对象值,主要用于对集合中的元素排序。
-
IComparer 接口用于在一个单独的类中实现,用于比较任意两个对象。
-
IComparable 接口用于在要比较的对象的类中实现,可以比较任意两个对象。
-
在比较器中还提供了泛型接口的表示形式,即 IComparer<T> 和 IComparable<T> 的形式
<!--more-->
二 方法比较
编号 | 接口 | 方法 | 作用 |
---|---|---|---|
1 | IComparable | CompareTo(T obj) | 比较两个对象值 |
2 | IComparer | Compare(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>