位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# IComparable 和 IComparer 接口

提问人:刘团圆发布时间:2020-12-07

IComparable和IComparer接口是.NETFramework中比较对象的标准方式。这两个接口之间的区别如下:

    •IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象。

    •IComparer在一个单独的类中实现,可以比较任意两个对象.

一般使用IComparable给出类的默认比较代码,使用其他类给出非默认的比较代码。

IComparable提供了一个方法CompareTo(),这个方法接受一个对象。例如,在实现该方法时,使其可以接受一个Person对象,以便确定这个人比当前的人更年老述是更年轻,实际上,这个方法返回一个int,所以也可以确定第二个人与当前的人的年龄差:

if (personl.CompareTo(person2) == 0)

{

    WriteLine("Same age");

)

else if (personl,CompareTo(person2) > 0)

{

    WriteLine ("person 1 is Older");

else

{

    WriteLine ("personl is Younger");

}

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

if (personComparer.Compare(personl, person2) == 0)

{

    WriteLine("Same age");

}

else if (personComparer.Compare(personlr person2) > 0)

{

    WriteLine ("person 1 is Older");

}

else

{

    WriteLine("personl is Younger");

}

    这两种情况下,提供给方法的参数是System.ObjeCt类型。这意味着可以比较一个对象与其他任意类型的另一个对象。所以,在返回结果之前,通常需要进行某种类型比较,如果使用了错误类型,还会抛出异常。

    .NET Framework 在类 Comparer 上提供了 IComparer 接口的默认实现代码,类 Comparer 位于 System Collections 名称空间中,可以对简单类型以及支持IComparable接口的任意类型进行特定文化的比较。例如,可通过下面的代码使用它:

    string firstString = "First String"; 

    string secondString = "Second String1";

    WriteLine($"Comparing '{firstString}' and  '{secondString}', " + $"result: {Comparer.Default.Compare(first String # secondString)}"}; 

    int firstNumber = 35; 

    int secondNumber = 23;

    WriteLine($"Comparing '{firstNumber}' and  '{ secondNumber}'," + $"result: {Comparer.Default.Compare(firstNumber, secondNumber)}");

这里使用Comparer.Default静态成员获取Comparer类的一个实例,接着使用Compare()方法比较前两个字符串,之后比较两个整数,结果如下:

    Comparing 'First String1 and 'Second String1, result: -1 

    Comparing '35' and '23 *, result: 1

在字母表中,F在S的前面,所以F“小于”S,第一个比较的结果就是-1。同样,35大于23,所以结果是1。注意这里的结果并未给出相差的幅度。

在使用Comparer时,必须使用可以比较的类型。例如,试图比较firstString和firstNumber就会生成一个异常。

下面列出了有关这个类的一些注意事项:

    •检查传递给Comparer.Compare()的对象,看看它们是否支持IComparable。如果支持,就使用该实现代码。

    •允许使用null值,它被解释为“小于”其他任意对象。

    •字符串根据当前文化来处理。要根据不同的文化(或语言)处理字符串,Comparer类必须使用其构造函数进行实例化,以便传送用于指定所使用的文化的Systeni.Globalization.CultureInfo对象。

    •字符串在处理时要区分大小写。如果要以不区分大小写的方式来处理它们,就需要使用 CaseInsensitiveCompurer类,该类以相同的方式工作。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部