IComparable, IComparable<T>, IComparer, IComparer<T>的区别
注:在.Net framework3.5中已经取消来IComparer接口,原因是该接口比较低效。原因请看下文。
1. IComparable<T>, IComparable接口
IComparable<T>是IComparable的泛型版本。这两个接口都需要实现方法CompareTo。IComparable是实现一般对象的比较接口,
int CompareTo(object obj),它提供来对单个对象进行比较的接口,继承IComparable的类需要自己提供排序比较函数以便对集合对象进行正确序列比较。在使用IComparable接口时需要对非object对象进行装箱和拆箱操作,所以每调用一次CompareTo就需要完成至少2次操作(装箱-拆箱).
public class MyClass : IComparable
{
public int CompareTo(Object obj)
{
MyClass cls = obj as MyClass;
}
}所以如果你比较的对象不是Object对象,建议使用泛型版本的IComparable<T>。
2.IComparer<T>, IComparer接口
IComparer<T>也是IComparer接口的泛型版本,该接口为两对象的比较提供来另一种机制。IComparer接口需要实现Compare方法int Compare(object x, object y),该方法返回三个值1, 0, -1分别表示大于,等于,小于。我们发现IComparable接口和IComparer接口的实现方法所传递的参数是不同的。继承IComparer接口的类可以利用.net framework的公有排序方式如ArrayList.Sort进行排序,因此我们可以不必定义对象的排序操作。IComparer接口存在与IComparable接口同样的效率问题。调用一次Compare操作需要进行4次的装箱拆箱操作,因此在VS2008中已经去掉来从IComparer接口,如果实现相同的功能你可以从IComparer<T>继承。
IComparable<T>
对自定义类的对象排序
实现泛型集合中以类为元素时的sort排序功能
public int CompareTo(Student other)
{
return this.Name.CompareTo(other.Name);
}
IComparer<T>
比较两个对象
实例化一下对象 Sort(T) T为实例化对象,用以实现特殊排序方式
//姓名比较器
public class NameComparer : IComparer<Student>
{
#region IComparer<Student> 成员
public int Compare(Student x, Student y)
{
return (x.Name.CompareTo(y.Name));
}
#endregion
}
//姓名比较器降序
public class NameComparerDesc : IComparer<Student>
{
#region IComparer<Student> 成员
public int Compare(Student x, Student y)
{
return (y.Name.CompareTo(x.Name));
}
#endregion
}
//年龄比较器
public class AgeComparer : IComparer<Student>
{
#region IComparer<Student> 成员
public int Compare(Student x, Student y)
{
return (x.Age.CompareTo(y.Age));
}
#endregion
}
}
泛型接口IComparable<T>及IComparable<T>使用
IComparable<T>是IComparable接口的泛型版本,对比较对象的类型做出了约束。使用方法如下:
(1)定义类实现接口,如 public class Student:IComparable<Student>
(2)实现接口中的泛型方法CompareTo(T t),如
public Int32 CompareTo(Student other)
{
return this.Age.CompareTo(other.Age);
}
(3)可以对加入泛型集合中的对象进行默认排序
List<Student> students = new List<Student>();
Student s1 = new Student("b", 20, Genders.Male);
Student s2 = new Student("a", 18, Genders.Male);
students.Sort();
如果想在排序时指定排序方式,则可调用Sort方法的重载方法Sort(IComparer<T> comparer)。使用方法如下:
(1)定义类实现接口,如public class NameCompare : IComparer<Student>
(2)实现接口中的泛型方法int Compare(T x,T y),如
public int Compare(Student x, Student y)
{
return x.Name.CompareTo(y.Name);
}
(3)可以对加入泛型集合中的对象按指定方式进行排序
students.Sort(new NameCompare());