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

IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口之间的区别如下:
1. IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象。
2.IComparer 在一个单独的类中实现,可以比较任意两个对象。
一般情况下,我们使用 IComparable 给出类的默认比较代码,使用其他类给出非默认的比较代码。
一、IComparable提供了一个方法int CompareTo(object obj)。这个方法接受一个对象,所以可以实现这个接口
比如:以便把 Person 对象传送给它,
说明这个人是否比当前的人更年老或年轻。实际上,这个方法返回一个int,所以可和下面的代码说明第二个人更年老还是更年轻。

代码如下:


if(person1.CompareTo(person2) == 0)
{
  Console.WriteLine("Sameage");
}
else if(person1.CompareTo(person2) > 0 )
{
  Console.WriteLine("person1 is older");
}
else
{
  Console.WriteLine("person1is younger");
}


二、IComparer 也提供了一个方法Compare().这个方法接受两个对象,返回一个整型结果,这与 CompareTo()相同。
对于支持 IComparer的对象,可以使用下面的代码:

代码如下:


if(personComparer.Compare(person1,person2) == 0)
{
  Console.WriteLine("sameage");
}
else if(personComparer.Compare(person1,person2) > 0 )
{
  Console.WriteLine("person1 is older");
}
else
{
  Console.WriteLine("person1is younger");
}


在这两种情况下,提供给方法的参数是system.object类型。也就是说,可以比较任意类型的两个对象。所以,在返回结果之前,通常需要进行某种类型比较,如果使用了错误的类型,还会抛出异常。实际上,我们是使用泛型接口IComparable,可以省略对象转换。可以参见后面的日记。
三、.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 就会生成一个异常。
下面是这个类的一些注意事项:

.net框架包含两个类,实现了IComparer接口,ComparerCaseInsensitiveComparer类提供了IComparer的基本实现方式。
1
)不要使用new运算符直接创建Comparer类的实例,应调用Default方法,该方法将返回一个已被适当地初始化过的Comparer对象,如下:
ComparertheComparer=Comparer.Default

拥有Comparer对象以后,可以将比较类委托给调用它的Compare方法,如下:
publicint Compare
(object x,object y)
{

  returnComparer.Default.Compare(x,y);
}

2)CaseInsensitiveComparer类的行为与Comparer类非常相似,都是通过ICompareble接口比较任意两个对象,区别是前者对遇到的字符串不区分大小写的比较。与Comparer类似,初始化过的CaseInsensitiveComparer对象可以使用静态Default方法来获取索引,如下:
CaseInsensitiveCompareraComparer=CaseInsensitiveComparer.Default

你可能感兴趣的:(c#,.NET)