zoukankan      html  css  js  c++  java
  • 对象的比较与排序:IComparable和IComparer接口

    IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下:

    1. IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象。

    2. IComparer 在一个单独的类中实现,可以比较任意两个对象。

    先看 IComparable  这个接口方法是 int CompareTo(object obj); 方法只有一个参数,我们知道比较至少要有两个对象,所以这个方法只能应用在要比较的对象类中,参数传递的对象就可以和 this 做比较。

    class obj : IComparable<obj>
    {
        public int age = 10;

        public int CompareTo(obj other)
        {
            //return this.age.CompareTo(other.age); 
            
    //下面代码是此方法的具体实现 

            if (this.age == other.age)
            {
                return 0;
            }
            else if (this.age > other.age)
            {
                return 1;
            }
            else
            {
                return -1;
            }
        }
    }

    static void Main(string[] args)
    {
        obj a = new obj();
        obj b = new obj();

        a.CompareTo(b); // 0

        a.age = 20;
        a.CompareTo(b); // 1

        a.age = 5;
        a.CompareTo(b); // -1
    }

        由此可见,接口IComparable主要是实现类对象间的比较规则。

    再看IComparer 这个接口提供一个需要两个参数的方法,这个参数也再做比较运算,但是比较主要是为了为对象做排序而非为给类增加比较运算。

    class obj
    {
        public int age = 10;
    }

    class objcomp : IComparer<obj>
    {
        public int Compare(obj x, obj y)
        {
            //return x.age.CompareTo(y.age); 
            
    //下面代码是此方法的具体实现 

            if (x.age == y.age)
            {
                return 0;
            }
            else if (x.age > y.age)
            {
                return 1;
            }
            else
            {
                return -1;
            }
        }
    }

    static void Main(string[] args)
    {
        List<obj> list = new List<obj>();

        list.Add(new obj() { age = 50 });
        list.Add(new obj() { age = 20 });
        list.Add(new obj() { age = 40 });
        
        // 列表中元素原始顺序(按照age)50,20,40

        list.Sort(new objcomp()); // public void Sort(IComparer<T> comparer);调用了Sort方法的重载版本
        
        
    // 经过排序列表中元素顺序(按照age)20,40,50
    }

        当然了,如果你想更改排序规则按照降序排列可以交换 objcomp 中方法参数的 age 值大于和小于时的返回值。

  • 相关阅读:
    gdb查看内存(转)
    c++ 前置++与后置++的区别
    stl第二级空间配置器详解(1)
    stl空间配置器简介
    套接字描述符就绪条件
    针对TCP连接异常断开的分析
    linux僵尸进程产生的原因以及如何避免产生僵尸进程
    k8s istio 配置域名转发到外部节点机器上
    tinymce增加mathjax 支持数学公式录入渲染
    vue 配置 TinyMCE
  • 原文地址:https://www.cnblogs.com/kingcat/p/2583198.html
Copyright © 2011-2022 走看看