C# IComparable 和 IComparer 区别
理解很重要:
开始对这两个接口的区别一直是很模糊,看到很多书后,终于知道了区别,形成了个人的理解:
关于 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 ;
}
else if (this.Age > obj.Age)
{
return ;
}
else
{
return -;
}
}
3、此时的Person的实例就活生生的变成了一个可以比较的对象了,来,让我们看看他们是怎么用的
static void Main(string[] args)
{
Person p1 = new Person("郑为",);
Person p2 = new Person("刘德华",);
//根据返回的值就可以判断年龄的大小哦
int i = p1.CompareTo(p2);
}
4、现在我不用在Person类中写这个比较的方法,那现在的情况就变成这样子了,我手上没有比较的规则了,那我现在又要
比较怎么办呢,好紧张啊,不用紧张,你可以用工具啊,就比较的工具,接下来这个工具就要闪亮场了,这个工具就是专门用来比较人的,当然你后面还可以用泛型。
class PersonComparer : IComparer<Person>
{ public int Compare(Person x, Person y)
{
if (x.Age == y.Age)
{
return ;
}
else if (x.Age > y.Age)
{
return ;
}
else
{
return -;
}
}
}
5、有了工具之后,我们如何使用呢,请看:
static void Main(string[] args)
{
Person p1 = new Person("郑为",);
Person p2 = new Person("刘德华",);
//根据返回的值就可以判断年龄的大小哦
int i = new PersonComparer().Compare(p1,p2);
}
明白了吗,要是再不明白我也没有办法了,看下类和接口的相关知识吧,将书上的知识经过理解后讲出来我觉得才是自己的,最近我在看《深入理解C#》,一本让我很激动的书,欢迎与大家共同讨论C#知识。。。
C# IComparable 和 IComparer 区别的更多相关文章
- C#的 IComparable 和 IComparer接口及ComparableTo方法的 区别(非常重要)
(1)https://blog.csdn.net/ios99999/article/details/77800819 C# IComparable 和 IComparer 区别 (2)https:// ...
- 数组自定义排序:IComparable和IComparer接口
首先先说一下IComparable和IComparer的区别,前者必须在实体类中实现,后者可以单独出现在一个排序类中,即此类只包含一个compare方法. Array类使用快速算法对数组中的元素进行排 ...
- [0] 关于IComparable和IComparer接口和Comparer类
关于IComparable和IComparer接口 和 Comparer类 IComparable和ICompareframeworkr接口是.net 中比较对象的标准方式,这两个接口之间的区别如下: ...
- 比较和排序(IComparable和IComparer以及它们的泛型实现)
本文摘要: 1:比较和排序的概念: 2:IComparable和IComparer: 3:IComparable和IComparer的泛型实现IComparable<T>和ICompare ...
- C# 常用接口学习 IComparable 和 IComparer
C# 常用接口学习 IComparable 和 IComparer 作者:乌龙哈里 时间:2015-11-01 平台:Window7 64bit,Visual Studio Community 201 ...
- 比较和排序(IComparable和IComparer以及它们的泛型实现)(转)
C#笔记25:比较和排序(IComparable和IComparer以及它们的泛型实现) 本文摘要: 1:比较和排序的概念: 2:IComparable和IComparer: 3:IComparabl ...
- C# 中的IComparable和IComparer
前言 在开发过程中经常会遇到比较排序的问题,比如说对集合数组的排序等情况,基本类型都提供了默认的比较算法,如string提供了按字母进行排序,而int整数则是根据整数大小进行排序.但是在引用类型中(具 ...
- 对象的比较与排序:IComparable和IComparer接口
IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下: . ICompar ...
- c# 实现IComparable、IComparer接口、Comparer类的详解
在默认情况下,对象的Equals(object o)方法(基类Object提供),是比较两个对象变量是否引用同一对象.我们要必须我自己的对象,必须自己定义对象比较方式.IComparable和ICom ...
随机推荐
- 使用递归算法结合数据库解析成java树形结构
使用递归算法结合数据库解析成java树形结构 1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHA ...
- centos7修改网卡名称
[root@localhost ~]# cd /etc/sysconfig/network-scripts/[root@localhost network-scripts]# mv ifcfg-eno ...
- Vue模板逻辑
前面的话 上一篇介绍了Vue的模板内容,而对于一般的模板引擎来说,除了模板内容,还包括模板逻辑.常用的模板逻辑包括条件和循环.本文将详细介绍Vue模板逻辑 条件渲染 在Vue中,实现条件逻辑依靠条件指 ...
- 基于Dubbo的压测调优实例
不久前参与开发了一个基于dubbo分布式框架的底层账单系统,并实现了其中的一部分业务接口,目前需对这些接口进行压测,以评估生产环境所能承受的最大吞吐量.笔者以其中一个查询接口为例来回顾此次压测的整体流 ...
- Python使用PDFMiner解析PDF
近期在做爬虫时有时会遇到网站只提供pdf的情况,这样就不能使用scrapy直接抓取页面内容了,只能通过解析PDF的方式处理,目前的解决方案大致只有pyPDF和PDFMiner.因为据说PDFMiner ...
- 移动端为何不使用click而模拟tap事件及解决方案
移动端click会遇到2个问题,click会有200-300ms的延迟,同时click事件的延迟响应,会出现穿透,即点击会触发非当前层的点击事件. 为什么会存在延迟? Google开发者文档中有提到: ...
- Tomcat 部署安装及JVM调优~
Tomcat 部署Tomcat环境 环境准备 linux: CentOS 7.3 tomcat: 9.0.0.M21 jdk: 1.8.0_131 ip: 192.168.1.5 tomcat官方下载 ...
- Spring(一)之IOC、bean、注入
[TOC] spring简介 首先它是一个开源的.用来简化企业级应用开发的框架. Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务. 用RMI或web service远程 ...
- R的数据图形
R支持4种图形类型: base graphics, grid graphics, lattice graphics, ggplot2. Base graphics是R的默认图形系统. 一. 基本图 ...
- easyUI自带的时间插件日期选择、月份选择、时间选择的使用(转)
1.日期选择 只要将class设置成easyui-datebox就可以了,当然前提是已经应用了easyui的js <input type="text" class=" ...