位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > C# > 問(wèn)題詳情

C# IComparable 和 IComparer 接口

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-07

IComparable和IComparer接口是.NETFramework中比較對(duì)象的標(biāo)準(zhǔn)方式。這兩個(gè)接口之間的區(qū)別如下:

    ?IComparable在要比較的對(duì)象的類中實(shí)現(xiàn),可以比較該對(duì)象和另一個(gè)對(duì)象。

    ?IComparer在一個(gè)單獨(dú)的類中實(shí)現(xiàn),可以比較任意兩個(gè)對(duì)象.

一般使用IComparable給出類的默認(rèn)比較代碼,使用其他類給出非默認(rèn)的比較代碼。

IComparable提供了一個(gè)方法CompareTo(),這個(gè)方法接受一個(gè)對(duì)象。例如,在實(shí)現(xiàn)該方法時(shí),使其可以接受一個(gè)Person對(duì)象,以便確定這個(gè)人比當(dāng)前的人更年老述是更年輕,實(shí)際上,這個(gè)方法返回一個(gè)int,所以也可以確定第二個(gè)人與當(dāng)前的人的年齡差:

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也提供一個(gè)方法Compare()。這個(gè)方法接受兩個(gè)對(duì)象,返回一個(gè)整型結(jié)果,這與CompareTo()相同。對(duì)于支持IComparer的對(duì)象,可使用下面的代碼:

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");

}

    這兩種情況下,提供給方法的參數(shù)是System.ObjeCt類型。這意味著可以比較一個(gè)對(duì)象與其他任意類型的另一個(gè)對(duì)象。所以,在返回結(jié)果之前,通常需要進(jìn)行某種類型比較,如果使用了錯(cuò)誤類型,還會(huì)拋出異常。

    .NET Framework 在類 Comparer 上提供了 IComparer 接口的默認(rèn)實(shí)現(xiàn)代碼,類 Comparer 位于 System Collections 名稱空間中,可以對(duì)簡(jiǎn)單類型以及支持IComparable接口的任意類型進(jìn)行特定文化的比較。例如,可通過(guò)下面的代碼使用它:

    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靜態(tài)成員獲取Comparer類的一個(gè)實(shí)例,接著使用Compare()方法比較前兩個(gè)字符串,之后比較兩個(gè)整數(shù),結(jié)果如下:

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

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

在字母表中,F(xiàn)在S的前面,所以F“小于”S,第一個(gè)比較的結(jié)果就是-1。同樣,35大于23,所以結(jié)果是1。注意這里的結(jié)果并未給出相差的幅度。

在使用Comparer時(shí),必須使用可以比較的類型。例如,試圖比較firstString和firstNumber就會(huì)生成一個(gè)異常。

下面列出了有關(guān)這個(gè)類的一些注意事項(xiàng):

    ?檢查傳遞給Comparer.Compare()的對(duì)象,看看它們是否支持IComparable。如果支持,就使用該實(shí)現(xiàn)代碼。

    ?允許使用null值,它被解釋為“小于”其他任意對(duì)象。

    ?字符串根據(jù)當(dāng)前文化來(lái)處理。要根據(jù)不同的文化(或語(yǔ)言)處理字符串,Comparer類必須使用其構(gòu)造函數(shù)進(jìn)行實(shí)例化,以便傳送用于指定所使用的文化的Systeni.Globalization.CultureInfo對(duì)象。

    ?字符串在處理時(shí)要區(qū)分大小寫(xiě)。如果要以不區(qū)分大小寫(xiě)的方式來(lái)處理它們,就需要使用 CaseInsensitiveCompurer類,該類以相同的方式工作。

繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部