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

 更新时间:2013年05月22日 17:59:56   作者:  
本篇文章是对c#中实现IComparable、IComparer接口、Comparer类进行了详细的分析详解,需要的朋友参考下
在默认情况下,对象的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类,该类以相同的方式工作。

相关文章

  • C#默认双缓冲技术实例分析

    C#默认双缓冲技术实例分析

    这篇文章主要介绍了C#默认双缓冲技术,实例分析了双缓冲技术的设置与实现技巧,需要的朋友可以参考下
    2015-06-06
  • C#中对字符串进行压缩和解压的实现

    C#中对字符串进行压缩和解压的实现

    本文主要介绍了C#中对字符串进行压缩和解压的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C# double类型变量比较分析

    C# double类型变量比较分析

    这篇文章主要介绍了C# double类型变量比较分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • c# 自定义值类型一定不要忘了重写Equals,否则性能和空间双双堪忧

    c# 自定义值类型一定不要忘了重写Equals,否则性能和空间双双堪忧

    这篇文章主要介绍了c# 自定义值类型一定不要忘了重写Equals,帮助大家提高c# 程序的性能,感兴趣的朋友可以了解下
    2020-08-08
  • C#实现chart控件动态曲线绘制

    C#实现chart控件动态曲线绘制

    这篇文章主要为大家详细介绍了C#实现chart控件动态曲线绘制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C#获取指定年份第一个星期一具体日期的方法

    C#获取指定年份第一个星期一具体日期的方法

    这篇文章主要介绍了C#获取指定年份第一个星期一具体日期的方法,涉及C#日期与字符串操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C# Csv实现基本的读写和转换DataTable

    C# Csv实现基本的读写和转换DataTable

    本文主要介绍了C# Csv实现基本的读写和转换DataTable,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C#中的自动类型转换和强制类型转换

    C#中的自动类型转换和强制类型转换

    这篇文章主要介绍了C#中的自动类型转换和强制类型转换,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-08-08
  • c# 组合模式

    c# 组合模式

    组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。需求中式体现部分与整体层次的结构时,统一地使用组合对象中的所有对象时,应该考虑使用组合模式
    2012-10-10
  • C#实现文本文件读写方法汇总

    C#实现文本文件读写方法汇总

    本文给大家汇总介绍了C#实现文本文件读写的方法,十分的简单实用,有需要的小伙伴可以参考下。
    2015-06-06

最新评论