关于IComparable和IComparer接口 和 Comparer类

IComparable和ICompareframeworkr接口是.net 中比较对象的标准方式,这两个接口之间的区别如下:

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

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

一般情况下,我们使用 IComparable 给出类的默认比较代码,使用其他类给出非默认的比较代码。

IComparable提供了一个方法 CompareTo()。这个方法接受一个对象,所以可以实现它,以便把 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类型。也就是说,可以比较任意类型的两个对象。所以,在返回结果之前,通常需要进行某种类型比较,如果使用了错误

的类型,还会抛出异常。

.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类,该类以相同的方式工作。

[0] 关于IComparable和IComparer接口和Comparer类的更多相关文章

  1. c# 实现IComparable、IComparer接口、Comparer类的详解

    在默认情况下,对象的Equals(object o)方法(基类Object提供),是比较两个对象变量是否引用同一对象.我们要必须我自己的对象,必须自己定义对象比较方式.IComparable和ICom ...

  2. 对象的比较与排序:IComparable和IComparer接口

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

  3. C#中的IComparable 和 IComparer 接口,实现列表中的对象比较和排序

    借豆瓣某博主的话先对这两个接口进行一个解释: IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象 IComparer在一个单独的类中实现,可以比较任意两个对象. 如果已经支持 ...

  4. 数组自定义排序:IComparable和IComparer接口

    首先先说一下IComparable和IComparer的区别,前者必须在实体类中实现,后者可以单独出现在一个排序类中,即此类只包含一个compare方法. Array类使用快速算法对数组中的元素进行排 ...

  5. IComparable和IComparer接口

    C#中,自定义类型,支持比较和排序,需要实现IComparable接口.IComparable接口存在一个名为CompareTo()的方法,接收类型为object的参数表示被比较对象,返回整型值:1表 ...

  6. C#的 IComparable 和 IComparer接口及ComparableTo方法的 区别(非常重要)

    (1)https://blog.csdn.net/ios99999/article/details/77800819 C# IComparable 和 IComparer 区别 (2)https:// ...

  7. 实现IComparable、IComparer接口

    using System;using System.Collections.Generic; public class MyClass{ public class Employee:IComparab ...

  8. c# IComparable与IComparer接口

  9. C# List.Sort与IComparer接口及Comparison委托应用于集合排序

    C#里List.Sort的用法 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

随机推荐

  1. 蓝桥杯-打印大X-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  2. MongoDB3.4 shell CRUD操作

    输入db,显示你正在操作的数据库:切换数据库,输入use dbName,如果数据库不存在的话会自动帮我们创建一个:使用show dbs可以显示所有可用的数据库. 测试数据在文末 插入文档 插入操作的行 ...

  3. python 基础之pickle 与json 报错问题解决方案

    Python 基础之pickle与json 有没有在搞pickle与json在进行数据储存的时候老是报错,这个有些让人烦恼,在之前有一篇介绍过它们的基本用法以及在使用过长中避免一些坑,但是今天在把对象 ...

  4. C# selenium环境配置

    1.下载C#selenium     selenium官网:  http://www.seleniumhq.org/download/   下载后解压:     打开net35后,将里面的dll文件添 ...

  5. C语言中的指针

    请先看C++中的指针概述,这里只是扩充 数组指针 其实这里主要说的就是c++中的指针运算 /* 数组元素指针: 一个变量有地址,一个数组包含若干个元素,每个数组元素都有相应的地址, 指针变量可以指向数 ...

  6. MyEclipse9.0破解

    http://www.cnblogs.com/liulanglang/archive/2011/11/15/2249702.html

  7. Python变量运算字符串等

    一,作用域 操作 name = 'liuyueming' if 1==1:... print name... liuyueming 两次回车执行 修改代码 >>> if 1==1:. ...

  8. hdu1151 Air Raid 二分匹配

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1151 求最小路径覆盖 二分图最小路径覆盖=点的个数-最大匹配. 代码: #include<ios ...

  9. js算法集合(二) javascript实现斐波那契数列 (兔子数列)

    js算法集合(二)  斐波那契数列 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列进行研究,来加深对循环的理解.     Javascript实 ...

  10. 对类对象使用new时地址分配的情况

    我们知道,string类内部的构造函数是采用new来分配地址的.当创建对象时,会调用string的构造函数,从而实质上也使用了new.那么问题来了,如果我用new再创建一个string类型的指针呢?下 ...