c# 實(shí)現(xiàn)IComparable、IComparer接口、Comparer類的詳解
更新時(shí)間:2013年05月22日 17:59:56 作者:
本篇文章是對(duì)c#中實(shí)現(xiàn)IComparable、IComparer接口、Comparer類進(jìn)行了詳細(xì)的分析詳解,需要的朋友參考下
在默認(rèn)情況下,對(duì)象的Equals(object o)方法(基類Object提供),是比較兩個(gè)對(duì)象變量是否引用同一對(duì)象。
我們要必須我自己的對(duì)象,必須自己定義對(duì)象比較方式。
IComparable和ICompare 接口是.net framework 中比較對(duì)象的標(biāo)準(zhǔn)方式,這兩個(gè)接口之間的區(qū)別如下:
1. IComparable 在要比較的對(duì)象的類中實(shí)現(xiàn),可以比較該對(duì)象和另一個(gè)對(duì)象。
2.IComparer 在一個(gè)單獨(dú)的類中實(shí)現(xiàn),可以比較任意兩個(gè)對(duì)象。
一般情況下,我們使用 IComparable 給出類的默認(rèn)比較代碼,使用其他類給出非默認(rèn)的比較代碼。
一、IComparable提供了一個(gè)方法int CompareTo(object obj)。這個(gè)方法接受一個(gè)對(duì)象,所以可以實(shí)現(xiàn)這個(gè)接口
比如:以便把 Person 對(duì)象傳送給它,
說明這個(gè)人是否比當(dāng)前的人更年老或年輕。實(shí)際上,這個(gè)方法返回一個(gè)int,所以可和下面的代碼說明第二個(gè)人更年老還是更年輕。
if(person1.CompareTo(person2) == 0)
{
Console.WriteLine("Same age");
}
else if(person1.CompareTo(person2) > 0 )
{
Console.WriteLine("person 1 is older");
}
else
{
Console.WriteLine("person1 is younger");
}
二、IComparer 也提供了一個(gè)方法 Compare().這個(gè)方法接受兩個(gè)對(duì)象,返回一個(gè)整型結(jié)果,這與 CompareTo()相同。
對(duì)于支持 IComparer的對(duì)象,可以使用下面的代碼:
if(personComparer.Compare(person1,person2) == 0)
{
Console.WriteLine("same age");
}
else if(personComparer.Compare(person1,person2) > 0 )
{
Console.WriteLine("person 1 is older");
}
else
{
Console.WriteLine("person1 is younger");
}
在這兩種情況下,提供給方法的參數(shù)是system.object類型。也就是說,可以比較任意類型的兩個(gè)對(duì)象。所以,在返回結(jié)果之前,通常需要進(jìn)行某種類型比較,如果使用了錯(cuò)誤的類型,還會(huì)拋出異常。實(shí)際上,我們是使用泛型接口IComparable<T>,可以省略對(duì)象轉(zhuǎn)換??梢詤⒁姾竺娴娜沼?。
三、.net framework 在類 Comparer 上提供了 IComparer 接口的默認(rèn)實(shí)現(xiàn)方式,類 Comparer 位于 system.collections 名稱空間中,可以對(duì)簡(jiǎn)單類型以及支持IComparable
接口的任意類型進(jìn)行特定文化的比較。例如,可以通過下面的代碼使用它:
string firststring = "First String";
string secondstring = "Second string";
Comparer.Default.Compare(firststring , secondstring);
int firstNumber = 35;
int secondNumber = 23;
Comparer.Default.Compare(firstNumber , secondNumber);
這里使用Comparer.Default靜態(tài)成員獲取Comparer類的一個(gè)實(shí)例,接著使用 Compare()方法來比較。
在使用 Comparer時(shí),必須使用可以比較的類型。例如,試圖比較firstString 和 firstNumber 就會(huì)生成一個(gè)異常。
下面是這個(gè)類的一些注意事項(xiàng):
1.檢查傳送給 Comparer.Compare()的對(duì)象,看看它們是否支持 IComparable.如果支持,就使用該實(shí)現(xiàn) 代碼。
2.允許使用null值,它表示小于其他對(duì)象。
3.字符串根據(jù)當(dāng)前文化來處理。要根據(jù)不同的文化(或語言)處理字符串,Comparer類必須使用其構(gòu)造函數(shù)進(jìn)行實(shí)例 化,以便傳送指定文化的System.Globalization.CultureInfo對(duì)象。
4.字符串在處理時(shí)要區(qū)分大小寫,如果要以不區(qū)分大小寫的方式來處理它們,就需要使用 CaseInsensitiveComparer類,該類以相同的方式工作。
我們要必須我自己的對(duì)象,必須自己定義對(duì)象比較方式。
IComparable和ICompare 接口是.net framework 中比較對(duì)象的標(biāo)準(zhǔn)方式,這兩個(gè)接口之間的區(qū)別如下:
1. IComparable 在要比較的對(duì)象的類中實(shí)現(xiàn),可以比較該對(duì)象和另一個(gè)對(duì)象。
2.IComparer 在一個(gè)單獨(dú)的類中實(shí)現(xiàn),可以比較任意兩個(gè)對(duì)象。
一般情況下,我們使用 IComparable 給出類的默認(rèn)比較代碼,使用其他類給出非默認(rèn)的比較代碼。
一、IComparable提供了一個(gè)方法int CompareTo(object obj)。這個(gè)方法接受一個(gè)對(duì)象,所以可以實(shí)現(xiàn)這個(gè)接口
比如:以便把 Person 對(duì)象傳送給它,
說明這個(gè)人是否比當(dāng)前的人更年老或年輕。實(shí)際上,這個(gè)方法返回一個(gè)int,所以可和下面的代碼說明第二個(gè)人更年老還是更年輕。
復(fù)制代碼 代碼如下:
if(person1.CompareTo(person2) == 0)
{
Console.WriteLine("Same age");
}
else if(person1.CompareTo(person2) > 0 )
{
Console.WriteLine("person 1 is older");
}
else
{
Console.WriteLine("person1 is younger");
}
二、IComparer 也提供了一個(gè)方法 Compare().這個(gè)方法接受兩個(gè)對(duì)象,返回一個(gè)整型結(jié)果,這與 CompareTo()相同。
對(duì)于支持 IComparer的對(duì)象,可以使用下面的代碼:
復(fù)制代碼 代碼如下:
if(personComparer.Compare(person1,person2) == 0)
{
Console.WriteLine("same age");
}
else if(personComparer.Compare(person1,person2) > 0 )
{
Console.WriteLine("person 1 is older");
}
else
{
Console.WriteLine("person1 is younger");
}
在這兩種情況下,提供給方法的參數(shù)是system.object類型。也就是說,可以比較任意類型的兩個(gè)對(duì)象。所以,在返回結(jié)果之前,通常需要進(jìn)行某種類型比較,如果使用了錯(cuò)誤的類型,還會(huì)拋出異常。實(shí)際上,我們是使用泛型接口IComparable<T>,可以省略對(duì)象轉(zhuǎn)換??梢詤⒁姾竺娴娜沼?。
三、.net framework 在類 Comparer 上提供了 IComparer 接口的默認(rèn)實(shí)現(xiàn)方式,類 Comparer 位于 system.collections 名稱空間中,可以對(duì)簡(jiǎn)單類型以及支持IComparable
接口的任意類型進(jìn)行特定文化的比較。例如,可以通過下面的代碼使用它:
復(fù)制代碼 代碼如下:
string firststring = "First String";
string secondstring = "Second string";
Comparer.Default.Compare(firststring , secondstring);
int firstNumber = 35;
int secondNumber = 23;
Comparer.Default.Compare(firstNumber , secondNumber);
這里使用Comparer.Default靜態(tài)成員獲取Comparer類的一個(gè)實(shí)例,接著使用 Compare()方法來比較。
在使用 Comparer時(shí),必須使用可以比較的類型。例如,試圖比較firstString 和 firstNumber 就會(huì)生成一個(gè)異常。
下面是這個(gè)類的一些注意事項(xiàng):
1.檢查傳送給 Comparer.Compare()的對(duì)象,看看它們是否支持 IComparable.如果支持,就使用該實(shí)現(xiàn) 代碼。
2.允許使用null值,它表示小于其他對(duì)象。
3.字符串根據(jù)當(dāng)前文化來處理。要根據(jù)不同的文化(或語言)處理字符串,Comparer類必須使用其構(gòu)造函數(shù)進(jìn)行實(shí)例 化,以便傳送指定文化的System.Globalization.CultureInfo對(duì)象。
4.字符串在處理時(shí)要區(qū)分大小寫,如果要以不區(qū)分大小寫的方式來處理它們,就需要使用 CaseInsensitiveComparer類,該類以相同的方式工作。
相關(guān)文章
C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法
這篇文章主要介紹了C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法,涉及網(wǎng)絡(luò)文件操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05C#控制臺(tái)程序?qū)崿F(xiàn)開啟、關(guān)閉SQLServer服務(wù)的代碼分享
這篇文章主要介紹了C#控制臺(tái)程序?qū)崿F(xiàn)開啟、關(guān)閉SQLServer服務(wù)的代碼分享,需要的朋友可以參考下2014-05-05C# Winform 子窗體訪問父級(jí)窗體的控件和屬性
本文主要介紹兩種子窗體訪問父窗體控件和屬性的方法,大家可以參考一下,本人比較偏向第二種,把父窗體作為屬性傳遞,一勞永逸,想訪問父窗體的什么控件屬性都可以。2016-05-05C#反射在實(shí)際應(yīng)用中的實(shí)例代碼
C#反射在實(shí)際應(yīng)用中的實(shí)例代碼,需要的朋友可以參考一下2013-03-03