IComparable和IComparer 区别

在默认情况下,对象的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类,该类以相同的方式工作。

时间: 2024-10-11 12:22:43

IComparable和IComparer 区别的相关文章

比较和排序(IComparable和IComparer以及它们的泛型实现)

本文摘要: 1:比较和排序的概念: 2:IComparable和IComparer: 3:IComparable和IComparer的泛型实现IComparable<T>和IComparer<T>: 1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如string提供了按字母进行比较,int提供了按整数大小进行比较. 2:ICompara

C# 中的IComparable和IComparer

前言 在开发过程中经常会遇到比较排序的问题,比如说对集合数组的排序等情况,基本类型都提供了默认的比较算法,如string提供了按字母进行排序,而int整数则是根据整数大小进行排序.但是在引用类型中(具有多个字段),那么这个排序当然也是取决于我们特定的值. IComparable接口 该接口由其值可以排序或排序的类型实现,并提供强类型的比较方法以对泛型集合对象的成员进行排序,例如数字可以大于第二个数字,一个字符串可以在另一个字符串之前以字母顺序出现.他要求实现类型定义的一个方法,CompareTo

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

IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下: 1. IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象. 2. IComparer 在一个单独的类中实现,可以比较任意两个对象. 先看 IComparable 这个接口方法是 int CompareTo(object obj); 方法只有一个参数,我们知道比较至少要有两个对象,所以这个方法

IComparable和IComparer

using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace no._1 { class Program { static void Main(string[] args) { ArrayList arr1 = new ArrayList() { new P

IComparable和IComparer接口的简析

默认情况下,对象的Equals(object o)方法是比较两个对象是否引用同一个对象.如果我们有自己的对象,就要自己定义对象比较方式: 1.IComparable在要比较的对象(类的实例化就是对象)类中实现,可以比较该对象和另一个对象. 2.IComparer在一个单独的类中实现,可以任意比较两个对象. 通俗的讲,IComparable是能够比较,具备比较的能力.比如说某个人具备编程的能力,如果需要对编程能力的高低进行比较的话,就必须在自己的类中去实现怎么具体的方法.IComparer是比较者

C# 常用接口学习 IComparable 和 IComparer

作者:乌龙哈里 时间:2015-11-01 平台:Window7 64bit,Visual Studio Community 2015 参考: Microsoft Refernce Souce MSDN 章节: 接口 IConmparable 实现 接口 IComparable<T> 实现 接口 IComparer<T> 实现 正文: 一.接口 IConmparable 的实现 class Fruit {     public string Name;     public int

比较和排序 IComparable And IComparer

1.List<Student>默认排序 为类创建默认排序实现IComparable,此代码的实现为年龄升序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IComparable_And_IComparer.Model { /// <summary> /// 学生类 /// <

C# 用实例来理解IComparable和IComparer

通过Array的Sort方法来理解的 Sort方法要 通过对象去继承IComparable接口来实现排序(当然也有其它办法),我想入门这可能就是对这句话有点不理解,在下面会有注释 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections; namespace ConsoleApplication1{ /// <summary> /// 设置

比较和排序:IComparable和IComparer

创建实体类,如Person,默认按照年龄进行排序,则需要为实体类实现IComparable接口. class Person : IComparable { public string Name { get; set; } public int Age { get; set; } public override string ToString() { return string.Format("Name : {0} ; Age : {1} .", this.Name, this.Age)