C# IComparable 和 IComparer 接口
IComparable和IComparer接口是.NETFramework中比較對象的標準方式。這兩個接口之間的區(qū)別如下:
?IComparable在要比較的對象的類中實現(xiàn),可以比較該對象和另一個對象。
?IComparer在一個單獨的類中實現(xiàn),可以比較任意兩個對象.
一般使用IComparable給出類的默認比較代碼,使用其他類給出非默認的比較代碼。
IComparable提供了一個方法CompareTo(),這個方法接受一個對象。例如,在實現(xiàn)該方法時,使其可以接受一個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()。這個方法接受兩個對象,返回一個整型結(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 接口的默認實現(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ù)當前文化來處理。要根據(jù)不同的文化(或語言)處理字符串,Comparer類必須使用其構(gòu)造函數(shù)進行實例化,以便傳送用于指定所使用的文化的Systeni.Globalization.CultureInfo對象。
?字符串在處理時要區(qū)分大小寫。如果要以不區(qū)分大小寫的方式來處理它們,就需要使用 CaseInsensitiveCompurer類,該類以相同的方式工作。
點擊加載更多評論>>