Visual C#中如何使用IComparable和IComparer接口
本文同時(shí)討論了IComparable和IComparer接口,原因有兩點(diǎn)。這兩個(gè)接口經(jīng)常一起使用。雖然接口類(lèi)似且名稱相似,但它們卻有不同的用途。
原文:Use the IComparable and IComparer interfaces in Visual CSharp
本文介紹了在Visual C#中如何使用IComparer和IComparable接口。
概要
本文同時(shí)討論了IComparable和IComparer接口,原因有兩點(diǎn)。這兩個(gè)接口經(jīng)常一起使用。雖然接口類(lèi)似且名稱相似,但它們卻有不同的用途。
如果你有一個(gè)支持IComparer的類(lèi)型數(shù)組(例如字符串或整數(shù)),你可以對(duì)它進(jìn)行排序而不需要提供任何對(duì)IComparer的顯式引用(譯注:意思是把一個(gè)IComparer的實(shí)現(xiàn)類(lèi)作為參數(shù)傳遞給排序方法)。在這種情況下,數(shù)組元素會(huì)被轉(zhuǎn)換為IComparer的默認(rèn)實(shí)現(xiàn)(Comparer.Default)。然而,如果你想為自定義對(duì)象提供排序或比較能力,你必須實(shí)現(xiàn)這兩個(gè)接口中的一個(gè)或兩個(gè)。
本文引用了Microsoft .NET Framework類(lèi)庫(kù)命名空間System.Collections。
IComparable 接口
IComparable 接口的作用是提供一種比較特定類(lèi)型的兩個(gè)對(duì)象的方法。如果你想為你的對(duì)象提供任何排序能力,那么這是必須的??梢詫?IComparable 視為為你的對(duì)象提供默認(rèn)的排序順序。例如,如果你有一個(gè)對(duì)象類(lèi)型的數(shù)組,然后你在該數(shù)組上調(diào)用 Sort 方法,則排序期間的對(duì)象比較是由 IComparable 提供的。當(dāng)你實(shí)現(xiàn) IComparable 接口時(shí),必須實(shí)現(xiàn) CompareTo 方法,如下所示:
// IComparable 的 CompareTo 方法,提供默認(rèn)的排序。
int IComparable.CompareTo(object obj)
{
Car c=(Car)obj;
return String.Compare(this.make,c.make);
}CompareTo 方法中如何進(jìn)行比較取決于被比較值的數(shù)據(jù)類(lèi)型。在本例中使用 String.Compare方法,因?yàn)楸贿x擇用于比較的屬性是字符串。
IComparer 接口
IComparer 接口的作用是提供更多的比較機(jī)制。例如,你可能想要你的類(lèi)的排序上使用多個(gè)字段或?qū)傩?,在同一字段上提供升序和降序,或者兩者兼而有之。(譯注,這個(gè)時(shí)候就必須要使用IComparer 接口了。)
使用 IComparer 是一個(gè)兩步過(guò)程。首先,聲明一個(gè)實(shí)現(xiàn) IComparer 的類(lèi),然后實(shí)現(xiàn) Compare 方法:
private class SortYearAscendingHelper : IComparer
{
int IComparer.Compare(object a, object b)
{
Car c1=(Car)a;
Car c2=(Car)b;
if (c1.year > c2.year)
return 1;
if (c1.year < c2.year)
return -1;
else
return 0;
}
}注意:
IComparer.Compare 方法需要三元比較。根據(jù)其中一個(gè)值是否大于、等于或小于另一個(gè)值,返回1、0或-1。可以通過(guò)切換此方法中的邏輯運(yùn)算符來(lái)更改排序順序(升序或降序)。
第二步是聲明一個(gè)返回IComparer對(duì)象實(shí)例的方法:
public static IComparer SortYearAscending()
{
return (IComparer) new SortYearAscendingHelper();
}在本例中,該對(duì)象被用作第二個(gè)參數(shù)被傳遞給Array.Sort的接受IComparer實(shí)例的重載方法。IComparer的使用并不局限于數(shù)組。它被許多不同的集合和控件類(lèi)接受為參數(shù)。
逐步講解的示例:
以下示例演示了如何使用這些接口。為了演示IComparer和IComparable,我們創(chuàng)建了一個(gè)名為Car的類(lèi),該類(lèi)擁有Make和Year兩個(gè)屬性。通過(guò)IComparable接口,為Make字段啟用了升序排序;通過(guò)IComparer接口,為Make字段啟用了降序排序。通過(guò)使用IComparer,為Year屬性提供了升序和降序排序。
1. 在Visual Studio中創(chuàng)建一個(gè)新的Console Application項(xiàng)目,把它命名為ConsoleEnum。
2. 將Program.cs重命名為Host.cs,然后用以下代碼替換原有代碼。
using System;
namespace ConsoleEnum
{
class host
{
[STAThread]
static void Main(string[] args)
{
// Create an array of Car objects.
Car[] arrayOfCars= new Car[6]
{
new Car("Ford",1992),
new Car("Fiat",1988),
new Car("Buick",1932),
new Car("Ford",1932),
new Car("Dodge",1999),
new Car("Honda",1977)
};
// Write out a header for the output.
Console.WriteLine("Array - Unsorted\n");
foreach(Car c in arrayOfCars)
Console.WriteLine(c.Make + "\t\t" + c.Year);
// Demo IComparable by sorting array with "default" sort order.
Array.Sort(arrayOfCars);
Console.WriteLine("\nArray - Sorted by Make (Ascending - IComparable)\n");
foreach(Car c in arrayOfCars)
Console.WriteLine(c.Make + "\t\t" + c.Year);
// Demo ascending sort of numeric value with IComparer.
Array.Sort(arrayOfCars,Car.SortYearAscending());
Console.WriteLine("\nArray - Sorted by Year (Ascending - IComparer)\n");
foreach(Car c in arrayOfCars)
Console.WriteLine(c.Make + "\t\t" + c.Year);
// Demo descending sort of string value with IComparer.
Array.Sort(arrayOfCars,Car.SortMakeDescending());
Console.WriteLine("\nArray - Sorted by Make (Descending - IComparer)\n");
foreach(Car c in arrayOfCars)
Console.WriteLine(c.Make + "\t\t" + c.Year);
// Demo descending sort of numeric value using IComparer.
Array.Sort(arrayOfCars,Car.SortYearDescending());
Console.WriteLine("\nArray - Sorted by Year (Descending - IComparer)\n");
foreach(Car c in arrayOfCars)
Console.WriteLine(c.Make + "\t\t" + c.Year);
Console.ReadLine();
}
}
}3. 在項(xiàng)目中新增一個(gè)類(lèi),命名為Car。
4. 用下面的代碼替換Car.cs中的代碼。
using System;
using System.Collections;
namespace ConsoleEnum
{
public class Car : IComparable
{
// Beginning of nested classes.
// Nested class to do ascending sort on year property.
private class SortYearAscendingHelper: IComparer
{
int IComparer.Compare(object a, object b)
{
Car c1=(Car)a;
Car c2=(Car)b;
if (c1.year > c2.year)
return 1;
if (c1.year < c2.year)
return -1;
else
return 0;
}
}
// Nested class to do descending sort on year property.
private class SortYearDescendingHelper: IComparer
{
int IComparer.Compare(object a, object b)
{
Car c1=(Car)a;
Car c2=(Car)b;
if (c1.year < c2.year)
return 1;
if (c1.year > c2.year)
return -1;
else
return 0;
}
}
// Nested class to do descending sort on make property.
private class SortMakeDescendingHelper: IComparer
{
int IComparer.Compare(object a, object b)
{
Car c1=(Car)a;
Car c2=(Car)b;
return String.Compare(c2.make,c1.make);
}
}
// End of nested classes.
private int year;
private string make;
public Car(string Make,int Year)
{
make=Make;
year=Year;
}
public int Year
{
get {return year;}
set {year=value;}
}
public string Make
{
get {return make;}
set {make=value;}
}
// Implement IComparable CompareTo to provide default sort order.
int IComparable.CompareTo(object obj)
{
Car c=(Car)obj;
return String.Compare(this.make,c.make);
}
// Method to return IComparer object for sort helper.
public static IComparer SortYearAscending()
{
return (IComparer) new SortYearAscendingHelper();
}
// Method to return IComparer object for sort helper.
public static IComparer SortYearDescending()
{
return (IComparer) new SortYearDescendingHelper();
}
// Method to return IComparer object for sort helper.
public static IComparer SortMakeDescending()
{
return (IComparer) new SortMakeDescendingHelper();
}
}
}5. 運(yùn)行項(xiàng)目。Console窗口顯示如下:
Array - Unsorted
Ford 1992
Fiat 1988
Buick 1932
Ford 1932
Dodge 1999
Honda 1977Array - Sorted by Make (Ascending - IComparable)
Buick 1932
Dodge 1999
Fiat 1988
Ford 1932
Ford 1992
Honda 1977Array - Sorted by Year (Ascending - IComparer)
Ford 1932
Buick 1932
Honda 1977
Fiat 1988
Ford 1992
Dodge 1999Array - Sorted by Make (Descending - IComparer)
Honda 1977
Ford 1932
Ford 1992
Fiat 1988
Dodge 1999
Buick 1932Array - Sorted by Year (Descending - IComparer)
Dodge 1999
Ford 1992
Fiat 1988
Honda 1977
Buick 1932
Ford 1932
到此這篇關(guān)于C#中使用IComparable和IComparer接口的文章就介紹到這了,更多相關(guān)C# IComparable和IComparer接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用udp如何實(shí)現(xiàn)消息的接收和發(fā)送
這篇文章主要介紹了C#使用udp如何實(shí)現(xiàn)消息的接收和發(fā)送問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
C#使用WinRar命令進(jìn)行壓縮和解壓縮操作的實(shí)現(xiàn)方法
這篇文章主要介紹了C#使用WinRar命令進(jìn)行壓縮和解壓縮操作的實(shí)現(xiàn)方法,涉及C#基于Process類(lèi)操作WinRar命令的相關(guān)實(shí)現(xiàn)技巧,代碼簡(jiǎn)潔實(shí)用,需要的朋友可以參考下2016-06-06
詳解C#中的定時(shí)器Timer類(lèi)及其垃圾回收機(jī)制
這篇文章主要介紹了C#中的定時(shí)器Timer類(lèi)及其垃圾回收機(jī)制,講解了Timer相關(guān)的單線程異步工作,需要的朋友可以參考下2016-04-04
C#微信公眾平臺(tái)開(kāi)發(fā)之高級(jí)群發(fā)接口
這篇文章主要為大家詳細(xì)介紹了C#微信公眾平臺(tái)開(kāi)發(fā)之高級(jí)群發(fā)接口的相關(guān)資料,需要的朋友可以參考下2016-03-03
Unity實(shí)現(xiàn)物體運(yùn)動(dòng)軌跡的繪制
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)物體運(yùn)動(dòng)軌跡的繪制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Linq兩個(gè)List集合取交集的實(shí)現(xiàn)
這篇文章主要介紹了Linq兩個(gè)List集合取交集的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
C#獲取文件名和文件路徑的兩種實(shí)現(xiàn)方式
這篇文章主要介紹了C#獲取文件名和文件路徑的兩種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

