IComparable, IComparable, IComparer, IComparer的区别
注:在.Net framework3.5中已经取消来IComparer接口,原因是该接口比较低效。原因请看下文。
1. IComparable<T>, IComparable接口
IComparable<T>是IComparable的泛型版本。这两个接口都需要实现方法CompareTo。IComparable是实现一般对象的比较接口,
int CompareTo(object obj),它提供来对单个对象进行比较的接口,继承IComparable的类需要自己提供排序比较函数以便对集合对象进行正确序列比较。在使用IComparable接口时需要对非object对象进行装箱和拆箱操作,所以每调用一次CompareTo就需要完成至少2次操作(装箱-拆箱).
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>继承。
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>。{
public int CompareTo(Object obj)
{
MyClass cls = obj as MyClass;
}
}
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>继承。
将想法付诸于实践,借此来影响他人是一个人存在的真正价值