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

时间:2022-07-23 00:25:56 

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

标签:IComparable,IComparer接口,Comparer类
0
投稿

猜你喜欢

  • Android调用系统图库获取图片的方法

    2023-09-23 04:13:02
  • Spring初始化与销毁顺序案例演示详解

    2021-06-08 14:33:10
  • C# WPF ListView控件的实例详解

    2022-08-05 17:54:23
  • Android实现Service获取当前位置(GPS+基站)的方法

    2023-04-03 16:28:28
  • 找出链表倒数第n个节点元素的二个方法

    2022-07-20 13:35:40
  • 浅谈Mybatis分页插件,自定义分页的坑

    2021-12-15 01:28:20
  • Flutter深色模式适配的实现

    2023-01-22 12:41:03
  • Android自定义View实现公交成轨迹图

    2021-07-12 12:00:04
  • Java并发工具类LongAdder原理实例解析

    2023-11-25 15:50:20
  • 详谈springboot过滤器和拦截器的实现及区别

    2022-07-22 04:44:24
  • android studio3.0以上如何通过navicat访问SQLite数据库文件

    2022-03-26 14:28:55
  • C#难点逐个击破(8):可空类型System.Nullable

    2023-07-04 14:49:40
  • Android的HTTP类库Volley入门学习教程

    2022-06-08 11:56:51
  • Android sdutio配置Zxing进行扫码功能的实现方法

    2023-12-12 15:40:13
  • Java正则之贪婪匹配、惰性匹配

    2022-08-14 16:41:23
  • Java扑克牌速算24的方法

    2022-10-13 22:17:18
  • java中文传值乱码问题的解决方法

    2023-11-25 16:26:47
  • java中驼峰与下划线的写法互转

    2023-09-21 09:47:36
  • C++ pair的用法案例详解

    2021-09-21 01:40:20
  • Java元注解Retention代码示例介绍

    2023-10-21 02:32:32
  • asp之家 软件编程 m.aspxhome.com