C#泛型-泛型接口IComparer——比较器

IComparer<T>接口定义了为比较两个对象而实现的方法。其定义如下:

public interface IComparer<T>

{

inr Compare(T x,T y);

}

类型参数“T”是要比较的对象的类型。Compare方法比较两个对象并返回一个值,指示一个对象是小于,等于还是大于另一个对象。参数x是要比较的第一个对象,y是要比较的第二个对象,均属于类型T。

如果返回值大于0,则x>y。

如果返回值大于0,则x<y。

如果返回值大于0,则x=y。

IComparer<T>泛型接口主要的作用是,作为参数传入Sort()方法,实现对象比较方式的排序。Sort方法的语法语法如下:

public void Sort (IComparer<T> comparer)

这个方法的参数是IComparer<T>泛型接口,也称为比较器,如果将不同的比较器传入Sort()方法,就可以实现不同的比较方式。

首先实现一个比较器,由于接口不能有方法的实现体,所以要具体实现方法,必须在派生类中完成。代码如下:

public class NameCom:IComparer<Student>

{

//实现IComparer<T>中的方法

public int Compare(Student x,Student y)

{

return (x.Name.CompareTo(y.Name));

}

}

在派生类NameCom中实现了Compare方法,返回值即为两个对象比较后的值。定义了比较器之后,就要调用Sort方法实现顺序。

示例代码如下:

private void NameSort()

{

//传入实现了姓名升序比较器的对象

lst.Sort(new NameCom())

}

其中,lst是List<Student>的一个集合对象,用来存储Student类的对象,Sort方法是List<>提供的排序方法,用new关键字创建了一个比较器的对象,作为参数传到Sort方法中,就实现了自定义方法排序的功能。下面通过一个简单的例子进一步了解IComparer<T>泛型接口的用法和使用价值。

using System;

using System.Collections.Generic;

/// <summary>

/// 学生类

/// </summary>

public class Student

{

private string name;

// 姓名

public string Name

{

get

{

return name;

}

set

{

name = value;

}

}

private int age;

// 年龄

public int Age

{

get

{

return age;

}

set

{

age = value;

}

}

private string grade;

// 年级

public string Grade

{

get

{

return grade;

}

set

{

grade = value;

}

}

//构造函数

public Student(string name, int age, string grade)

{

this.name = name;

this.age = age;

this.grade = grade;

}

public override string ToString()

{

return this.name + "," + this.age.ToString() + "," + this.grade;

}

}

//接着定义一个用于比较的类,实现IComparer<T>泛型接口:

public class StudentComparer: IComparer < Student >

{

public enum CompareType

{

Name, Age, Grade

}

private CompareType type;

// 构造函数,根据type的值,判断按哪个字段排序

public StudentComparer(CompareType type)

{

this.type = type;

}

public int Compare(Student x, Student y)

{

switch (this.type)

{

case CompareType.Name:

return x.Name.CompareTo(y.Name);

case CompareType.Age:

return x.Age.CompareTo(y.Age);

default:

//case CompareType.Grade:

return x.Grade.CompareTo(y.Grade);

}

}

}

public class test

{

public static void Main()

{

List < Student > arr = new List < Student > ();

arr.Add(new Student("张三", 7, "一年级"));

arr.Add(new Student("李四", 11, "二年级"));

arr.Add(new Student("王五", 21, "一年级"));

arr.Add(new Student("陈六", 8, "三年级"));

arr.Add(new Student("刘七", 15, "二年级"));

// 调用Sort方法,实现按年级排序

arr.Sort(new StudentComparer(StudentComparer.CompareType.Grade));

// 循环显示集合里的元素

foreach (Student item in arr)

Console.WriteLine(item.ToString());

// 调用Sort方法,实现按姓名排序

arr.Sort(new StudentComparer(StudentComparer.CompareType.Name));

// 循环显示集合里的元素

foreach (Student item in arr)

Console.WriteLine(item.ToString());

}

}