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

C# IComparable 和 IComparer 接口

提問人:劉團圓發(fā)布時間:2020-12-07

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

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

    ?IComparer在一個單獨的類中實現(xiàn),可以比較任意兩個對象.

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

IComparable提供了一個方法CompareTo(),這個方法接受一個對象。例如,在實現(xiàn)該方法時,使其可以接受一個Person對象,以便確定這個人比當(dāng)前的人更年老述是更年輕,實際上,這個方法返回一個int,所以也可以確定第二個人與當(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也提供一個方法Compare()。這個方法接受兩個對象,返回一個整型結(jié)果,這與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");

}

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

    .NET Framework 在類 Comparer 上提供了 IComparer 接口的默認(rèn)實現(xiàn)代碼,類 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靜態(tài)成員獲取Comparer類的一個實例,接著使用Compare()方法比較前兩個字符串,之后比較兩個整數(shù),結(jié)果如下:

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

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

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

在使用Comparer時,必須使用可以比較的類型。例如,試圖比較firstString和firstNumber就會生成一個異常。

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

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

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

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

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

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

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