zoukankan      html  css  js  c++  java
  • 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());

  • 相关阅读:
    拖拽改变元素位置或大小bug修复
    拖拽改变元素位置或大小
    vue使用input上传多张图片,可以预览
    javaScript面向对象编程学习(二)
    移动端适配字体大小
    js的时间戳的转换
    vue-cli3.X中的vue.config.js的配置
    javaScript面向对象编程学习(一)
    Visual Studio code 常用插件集集合。
    js的四个小练习
  • 原文地址:https://www.cnblogs.com/tangself/p/2041196.html
Copyright © 2011-2022 走看看