在默认情况下,对象的Equals(object o)方法(基类Object提供),是比较两个对象变量是否引用同一对象。
我们要必须我自己的对象,必须自己定义对象比较方式。
IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口之间的区别如下:
1. IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象。
2.IComparer 在一个单独的类中实现,可以比较任意两个对象。
一般情况下,我们使用 IComparable 给出类的默认比较代码,使用其他类给出非默认的比较代码。
一、IComparable提供了一个方法int CompareTo(object obj)。这个方法接受一个对象,所以可以实现这个接口
比如:以便把 Person 对象传送给它,
说明这个人是否比当前的人更年老或年轻。实际上,这个方法返回一个int,所以可和下面的代码说明第二个人更年老还是更年轻。
if(person1.CompareTo(person2) == 0)
{
Console.WriteLine("Same age");
}
else if(person1.CompareTo(person2) > 0 )
{
Console.WriteLine("person 1 is older");
}
else
{
Console.WriteLine("person1 is younger");
}
二、IComparer 也提供了一个方法 Compare().这个方法接受两个对象,返回一个整型结果,这与 CompareTo()相同。
对于支持 IComparer的对象,可以使用下面的代码:
if(personComparer.Compare(person1,person2) == 0)
{
Console.WriteLine("same age");
}
else if(personComparer.Compare(person1,person2) > 0 )
{
Console.WriteLine("person 1 is older");
}
else
{
Console.WriteLine("person1 is younger");
}
在这两种情况下,提供给方法的参数是system.object类型。也就是说,可以比较任意类型的两个对象。所以,在返回结果之前,通常需要进行某种类型比较,如果使用了错误
的类型,还会抛出异常。实际上,我们是使用泛型接口IComparable<T>,可以省略对象转换。可以参见后面的日记。
三、.net framework 在类 Comparer 上提供了 IComparer 接口的默认实现方式,类 Comparer 位于 system.collections 名称空间中,可以对简单类型以及支持IComparable
接口的任意类型进行特定文化的比较。例如,可以通过下面的代码使用它:
string firststring = "First String";
string secondstring = "Second string";
Comparer.Default.Compare(firststring , secondstring);
int firstNumber = 35;
int secondNumber = 23;
Comparer.Default.Compare(firstNumber , secondNumber);
这里使用Comparer.Default静态成员获取Comparer类的一个实例,接着使用 Compare()方法来比较。
在使用 Comparer时,必须使用可以比较的类型。例如,试图比较firstString 和 firstNumber 就会生成一个异常。
下面是这个类的一些注意事项:
1.检查传送给 Comparer.Compare()的对象,看看它们是否支持 IComparable.如果支持,就使用该实现 代码。
2.允许使用null值,它表示小于其他对象。
3.字符串根据当前文化来处理。要根据不同的文化(或语言)处理字符串,Comparer类必须使用其构造函数进行实例 化,以便传送指定文化的
System.Globalization.CultureInfo对象。
4.字符串在处理时要区分大小写,如果要以不区分大小写的方式来处理它们,就需要使用 CaseInsensitiveComparer类,该类以相同的方式工作。

转自:http://www.cnblogs.com/eagle1986/archive/2012/02/03/2278455.html

对象的比较与排序(二):实现IComparable和IComparer接口 和 Comparer类(转)相关推荐

  1. IComparable和Icomparer接口

    IComparable :object.CompareTo(object); Icomparer 接口 using System.Collections; int a=1;int b=2;//Cons ...

  2. .NET/C#中对自定义对象集合进行自定义排序的方法

    一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car ...

  3. 对象的比较与排序(三):实现IComparableT和IComparerT泛型接口

    来源:http://www.cnblogs.com/eagle1986/archive/2011/12/06/2278531.html 1:比较和排序的概念 比较:两个实体类之间按>,=,< ...

  4. 根据数组中对象的属性值排序倒叙

    数组中对象的属性值排序倒叙demo function compare(e) {return function (a, b) {var value1 = a[e];var value2 = b[e];r ...

  5. 按属性对自定义对象的ArrayList进行排序

    我读过有关使用Comparator对ArrayList进行排序的信息,但在所有示例中,人们都使用了compareTo ,根据一些研究,它是String的一种方法. 我想按自定义对象的属性之一对Arra ...

  6. java list数组排序_浅谈对象数组或list排序及Collections排序原理

    常需要对list进行排序,小到List,大到对自定义的类进行排序.不需要自行归并或堆排序.简单实现一个接口即可. 本文先会介绍利用Collections对List进行排序,继而讲到Collection ...

  7. 用递归将嵌套的JSON对象遍历出来,转为二维数组

    如题所示,代码如下: var arJsonNesting = [{id:1,name:"zhang3",children:[{id:2,name:"zhang33&quo ...

  8. SDUT 3399 数据结构实验之排序二:交换排序

    数据结构实验之排序二:交换排序 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 冒泡排序和快 ...

  9. js数组对象按照中文拼音排序

    今天遇到一个需求如图所示,下拉框按照中文拼音排序,而我们下拉框给的都是接口传过来的对象,所以要想排序,还是稍微需要处理一下的 话不多说,我们先看一个demo,根据这个demo,我们就能完成,我们想要的 ...

  10. 【Demo】IOS中将对象数组按照时间戳排序

    将对象按照时间戳排序,这里典型的一个例子是登录账户的排序:本地客户端可能保存了多个账户信息,在登录窗口用户可以选择已经登陆过的账户直接登录,现在的需求是要时刻让最近登陆过的账户排在前面,对于每个账户, ...

最新文章

  1. js createElement appendChild createTextNode用法
  2. 从基础设施到云原生应用,全方位解读阿里云原生新锐开源项目
  3. CodeVs 1059 汽车装油
  4. CodeForces - 967D Resource Distribution(贪心+二分+构造)
  5. 简单的java方法_Java简单实用方法一
  6. 012-centos6.5配置静态ip
  7. 读书笔记--疯狂Android讲义 目录
  8. 如何安装一个优秀的BUG管理平台(转)
  9. 《深入浅出WPF》读书笔记
  10. CentOS系统介绍
  11. TypeScript(四)声明文件、全局变量(三斜线指令)、npm包、UMD库、发布声明文件
  12. 优秀的 Verilog/FPGA开源项目介绍(二十九)- 开源网站
  13. Datawhale组队学习周报(第045周)
  14. 数据库原理知识点总结一
  15. C#反编译工具:.NET Reflector基础使用
  16. java坦克大战案例_JAVA实现经典坦克大战源代码
  17. 资深摄影师眼中,青岛值得一游的景点有哪些?
  18. React Native Camera的新手教程
  19. TIPTOP 4GL——自定义按钮前加图标
  20. 【ZeloEngine】沙箱机制

热门文章

  1. 分类战车SVM (第四话:拉格朗日对偶问题)
  2. python urllib2详解及实例
  3. trace (矩阵的迹) 的性质
  4. ubuntu18重启vncserver_Windows 10 远程连接 Ubuntu 18.04 Server图形界面
  5. Redis从安装到简单使用(windows)
  6. 关于stm32优先级大小的理解
  7. nodejs,webpack安装以及初步运用
  8. iOS 点击返回键崩溃的未解之谜
  9. 弹出浮层css+JQuery
  10. 1052. Linked List Sorting (25)再