zoukankan      html  css  js  c++  java
  • C# IComparable 和 IComparer 区别

    理解很重要:

    开始对这两个接口的区别一直是很模糊,看到很多书后,终于知道了区别,形成了个人的理解:

    关于 IComparable

    比喻一个类person实现了 IComparable,那么它就要重写CompareTo方法,就是在告诉大家,我实现了这个接口,所有我的实例都是可以比较的,并且比较的规则是按照我实现的IComparable中的方法CompareTo来进行的,并且比较的方式是person1.CompareTo(person2),其中person1和person2是person的两个实例,大家都称我们person的实例为“可以比较对象”。

    关于IComparer

    又比喻一个类personComparer实现了IComparer这个接口,那么它就要重写Compare方法,这个方法接收两个参数,在这个方法中对这两个参数进行比较,就是在告诉大家,同志们,我是 person的比较器,我能比较天所有的人类,只要你将两个人放入我的Compare方法中,我都能对他们进行比较,至于比较的规则当然是由我在类personComparerCompare方法中定咯,此时他们称我为person的“比较器”,专门用来比较person

    如果你还不明白就看下面的详细解释吧。看完之后我相信你再来看这些理解部分就会有感觉了。

    我现在的需求就是要比较天下所有人类的年龄

    1、造人的模子闪亮登场,与大家所想的造人方式是不是不一样,哈哈

       class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public Person() { }
            public Person(string name, int age) 
            { 
                this.Name = name; 
                this.Age = age; 
            }
        }

    2、我要将Person这个类的实例都成为可以按年龄比较的比象怎么办,那么此时我们就要实现IComparable接口

         并实现IComparable方法了

     class Person : IComparable
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public Person() { }
            public Person(string name, int age) 
            { 
                this.Name = name; 
                this.Age = age; 
            }
    
            public int CompareTo(object obj)
            {
                if (this.Age == obj.Age)
                {
                    return 0;
                }
                else if (this.Age > obj.Age)
                {
                    return 1;
                }
                else
                {
                    return -1;
                }
            }

    3、此时的Person的实例就活生生的变成了一个可以比较的对象了,来,让我们看看他们是怎么用的

    static void Main(string[] args)
            {
                Person p1 = new Person("郑为",28);
                Person p2 = new Person("刘德华",58);
                //根据返回的值就可以判断年龄的大小哦
                int i =  p1.CompareTo(p2);
            }

    4、现在我不用在Person类中写这个比较的方法,那现在的情况就变成这样子了,我手上没有比较的规则了,那我现在又要

         比较怎么办呢,好紧张啊,不用紧张,你可以用工具啊,就比较的工具,接下来这个工具就要闪亮场了,这个工具就是专门用来比较人的,当然你后面还可以用泛型。

    class PersonComparer : IComparer<Person>
            {
    
                public int Compare(Person x, Person y)
                {
                    if (x.Age == y.Age)
                    {
                        return 0;
                    }
                    else if (x.Age > y.Age)
                    {
                        return 1;
                    }
                    else
                    {
                        return -1;
                    }
                }
            }

    5、有了工具之后,我们如何使用呢,请看:

    static void Main(string[] args)
            {
                Person p1 = new Person("郑为",28);
                Person p2 = new Person("刘德华",58);
                //根据返回的值就可以判断年龄的大小哦
                int i = new PersonComparer().Compare(p1,p2);
            }

    明白了吗,要是再不明白我也没有办法了,看下类和接口的相关知识吧,将书上的知识经过理解后讲出来我觉得才是自己的,最近我在看《深入理解C#》,一本让我很激动的书,欢迎与大家共同讨论C#知识。。。

  • 相关阅读:
    微软WP7本地数据库之Sqlite编程技巧(转)
    AutoResetEvent详解
    桥接模式的简单分析
    解决VS2008 调试启动特别慢
    软件概要设计
    解决windows8不能安装ZUNE的问题
    CDATA的对特殊字符作用说明
    DataTable对象在内存中的使用(二)
    DataTable对象在内存中的使用(一)
    关于MVC3 CODE FIRST的安装
  • 原文地址:https://www.cnblogs.com/zhengwei-cq/p/7463341.html
Copyright © 2011-2022 走看看