Visual C#中如何使用IComparable和IComparer接口
本文同時討論了IComparable和IComparer接口,原因有兩點(diǎn)。這兩個接口經(jīng)常一起使用。雖然接口類似且名稱相似,但它們卻有不同的用途。
原文:Use the IComparable and IComparer interfaces in Visual CSharp
本文介紹了在Visual C#中如何使用IComparer和IComparable接口。
概要
本文同時討論了IComparable和IComparer接口,原因有兩點(diǎn)。這兩個接口經(jīng)常一起使用。雖然接口類似且名稱相似,但它們卻有不同的用途。
如果你有一個支持IComparer的類型數(shù)組(例如字符串或整數(shù)),你可以對它進(jìn)行排序而不需要提供任何對IComparer的顯式引用(譯注:意思是把一個IComparer的實現(xiàn)類作為參數(shù)傳遞給排序方法)。在這種情況下,數(shù)組元素會被轉(zhuǎn)換為IComparer的默認(rèn)實現(xiàn)(Comparer.Default)。然而,如果你想為自定義對象提供排序或比較能力,你必須實現(xiàn)這兩個接口中的一個或兩個。
本文引用了Microsoft .NET Framework類庫命名空間System.Collections。
IComparable 接口
IComparable 接口的作用是提供一種比較特定類型的兩個對象的方法。如果你想為你的對象提供任何排序能力,那么這是必須的??梢詫?IComparable 視為為你的對象提供默認(rèn)的排序順序。例如,如果你有一個對象類型的數(shù)組,然后你在該數(shù)組上調(diào)用 Sort 方法,則排序期間的對象比較是由 IComparable 提供的。當(dāng)你實現(xiàn) IComparable 接口時,必須實現(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ù)類型。在本例中使用 String.Compare方法,因為被選擇用于比較的屬性是字符串。
IComparer 接口
IComparer 接口的作用是提供更多的比較機(jī)制。例如,你可能想要你的類的排序上使用多個字段或?qū)傩?,在同一字段上提供升序和降序,或者兩者兼而有之。(譯注,這個時候就必須要使用IComparer 接口了。)
使用 IComparer 是一個兩步過程。首先,聲明一個實現(xiàn) IComparer 的類,然后實現(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ù)其中一個值是否大于、等于或小于另一個值,返回1、0或-1??梢酝ㄟ^切換此方法中的邏輯運(yùn)算符來更改排序順序(升序或降序)。
第二步是聲明一個返回IComparer對象實例的方法:
public static IComparer SortYearAscending()
{
return (IComparer) new SortYearAscendingHelper();
}在本例中,該對象被用作第二個參數(shù)被傳遞給Array.Sort的接受IComparer實例的重載方法。IComparer的使用并不局限于數(shù)組。它被許多不同的集合和控件類接受為參數(shù)。
逐步講解的示例:
以下示例演示了如何使用這些接口。為了演示IComparer和IComparable,我們創(chuàng)建了一個名為Car的類,該類擁有Make和Year兩個屬性。通過IComparable接口,為Make字段啟用了升序排序;通過IComparer接口,為Make字段啟用了降序排序。通過使用IComparer,為Year屬性提供了升序和降序排序。
1. 在Visual Studio中創(chuàng)建一個新的Console Application項目,把它命名為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. 在項目中新增一個類,命名為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)行項目。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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用WinRar命令進(jìn)行壓縮和解壓縮操作的實現(xiàn)方法
這篇文章主要介紹了C#使用WinRar命令進(jìn)行壓縮和解壓縮操作的實現(xiàn)方法,涉及C#基于Process類操作WinRar命令的相關(guān)實現(xiàn)技巧,代碼簡潔實用,需要的朋友可以參考下2016-06-06

