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 IComparer

 

 

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());

 

 

posted @ 2011-05-09 15:17  tangself  阅读(568)  评论(0编辑  收藏  举报