C# IComparable 和 IComparer 接口
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類,該類以相同的方式工作。
點(diǎn)擊加載更多評(píng)論>>