欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-18 22:01:40
在默认情况下,对象的equals(object o)方法(基类object提供),是比较两个对象变量是否引用同一对象。我们要必须我自己的对象,必须自己定义对象比较方式。ic...
在默认情况下,对象的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类,该类以相同的方式工作。

上一篇:

下一篇: