首页 > 编程语言 >C# IComparable 和 IComparer 区别

C# IComparable 和 IComparer 区别

时间:2023-03-02 13:59:01浏览次数:76  
标签:IComparer C# Age 比较 Person int IComparable public

C# IComparable 和 IComparer 区别

于 2017-09-02 13:53:48 发布7607 收藏 16    

理解很重要:

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

关于 IComparable

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

关于IComparer

又比喻一个类personComparer实现了IComparer这个接口,那么它就要重写Compare方法,这个方法接收两个参数,在这个方法中对这两个参数进行比较,就是在告诉大家,同志们,我是 person的比较器,我能比较天所有的人类,只要你将两个人放入我的Compare方法中,我都能对他们进行比较,至于比较的规则当然是由我在类personComparer的Compare方法中定咯,此时他们称我为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#知识。。。

 转载:https://blog.csdn.net/ios99999/article/details/77800819

标签:IComparer,C#,Age,比较,Person,int,IComparable,public
From: https://www.cnblogs.com/wugh8726254/p/17171521.html

相关文章

  • mac 安装node指定版本
    mac安装指定版本遇到的问题总结起因:mac安装最新版node,运行旧版本的项目时报错,需要将版本退回到低版本。过程:安装node最新版本地址:https://nodejs.org/en/卸载node:......
  • 14. Kubernetes - PV / PVC / NFS
    存储前面有通过hostPath或者emptyDir的方式来持久化数据,但是显然还需要更加可靠的存储来保存应用的持久化数据,这样容器在重建后,依然可以使用之前的数据。可存储资源和......
  • linux服务器解压缩zip文件时报错End-of-central-directory signature not found
    在向服务器上传一个windows上压缩的zip文件时出现报错End-of-central-directorysignaturenotfound. Eitherthisfileisnotazipfile,oritconstitutesonedis......
  • SpringMVC学习之基础篇
    浏览器地址栏请求:http:localhost:8080/springmvc_hello/hello?username=kkweb.xml:<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns:xsi="http://www.w3.org/2001/......
  • C#--静态函数与非静态函数的区别
    语法区别使用了static修饰符的方法为静态方法,反之为非静态方法,也就是实例方法。在内存中位置的区别静态方法:静态成员属于类所有,可以被各个实例公用,无论创建了多少个......
  • 【LeetCode二叉树#15】二叉搜索树中的众数(递归中序遍历)
    二叉搜索树中的众数力扣题目链接(opensnewwindow)给定一个有相同值的二叉搜索树(BST),找出BST中的所有众数(出现频率最高的元素)。假定BST有如下定义:结点左子树中所......
  • 不为人知的网络编程(十五):深入操作系统,一文搞懂Socket到底是什么
    1、引言我相信大家刚开始学网络编程中socket的时候,都跟我一样对书上所讲的socket概念云里雾里的、似懂非懂,很是困扰。这篇文章我打算从初学者的角度,用通俗易懂的文字,跟大......
  • Visual Studio Code 1.76 发布
    VSCode1.76已发布,此版本一些主要亮点包括:配置文件-活动配置文件徽章,通过命令面板快速切换配置文件。VSCode现在通过在管理活动栏图标上显示配置文件名称的前两......
  • vscode编辑VBA扩展 XVBA - Live Server VBA 代码格式化 自动缩进错误问题修复
    XVBA-LiveServerVBA  v4.0.26版本中,代码格式化时,发现以下问题:next后面没有字符的时候,不能识别为末行ifthen后面加逻辑单独作为一行时,错误的识别为开始行解决......
  • c语言实现有头单向链表
    #include<stdio.h>#include<stdlib.h>#include<string.h>//采用有头链表,头节点不存数据,所以数据操作都从头节点所指的下一节点开始,这样就不会误操作到头节点。typed......