[0] 关于IComparable和IComparer接口和Comparer类

关于IComparableIComparer接口 和 Comparer类 

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

 

posted on   范兵  阅读(200)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示