本文將逐步告訴您,使用兩個介面:
IComparer 和
IComparable。原因有兩個相同的發行項中討論這些介面。這些介面會經常使用一起,並雖然介面類似 (而且有類似的名稱),它們有不同的用途。
如果您已經支援
IComparer (例如
字串 或
整數) 型別的陣列,您可以排序該陣列而不需提供
IComparer 任何明確的參考。在這種情況下陣列的元素會轉換成
IComparer (
Comparer.Default) 的預設實作您。不過,如果想為您自訂物件提供排序] 或 [比較功能您必須實作這些介面之一或兩者。
下列的.NET Framework 類別庫命名空間參考本文中:
System.Collections
IComparable
IComparable 的角色是提供比較特定的型別之兩個物件的方法。這是必要如果您想要為您的物件提供任何排序功能。您可以將
IComparable 想像成提供您的物件的預設排序順序。比方說如果您有您的型別物件的陣列,而且您在該陣列上呼叫
Sort 方法,
IComparable 提供物件比較期間排序。當您實作
IComparable 介面時,您必須如下實作
CompareTo] 方法:
// Implement IComparable CompareTo method - provide default sort order.
int IComparable.CompareTo(object obj)
{
car c=(car)obj;
return String.Compare(this.make,c.make);
}
方法中的比較是根據所比較的值資料型別而有所不同。此範例中使用
String.Compare,因為所選擇的進行比較的屬性是字串。
IComparer
IComparer 的角色是提供額外的比較機制。比方說您可能要提供排序您的類別上多個欄位或屬性,遞增和遞減順序相同的欄位或兩者。
使用
IComparer 是兩個步驟的程序。第一次,宣告實作
IComparer 的類別和實作
比較 方法:
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 方法需要會傳回根據一個值是否大於、 等於,或小於另。 在第三比較。 1、 0 或-1可以在這個方法中切換邏輯運算子來變更排序順序 (遞增或遞減)。
第二個步驟是宣告傳回
IComparer 物件的執行個體的方法:
public static IComparer sortYearAscending()
{
return (IComparer) new sortYearAscendingHelper();
}
在此範例為第二個引數,當您呼叫多載的
Array.Sort 方法,接受
IComparer,使用物件。
IComparer 使用不限於陣列。它會接受在許多不同的集合與控制項類別中當做引數。
雖說是逐步範例
下列範例示範如何使用這些介面。若要示範
IComparer 和
IComparable,建立名為
汽車 的類別。
汽車 物件都有 [
製作] 和 [
年] 屬性。遞增排序欄位已啟用的
進行 透過
IComparable] 介面和上
進行 遞減排序] 欄位會啟用透過
IComparer 介面。遞增和遞減排序,提供透過
IComparer 的使用的 [
年] 屬性。
- 在 Visual C#,建立新的主控台應用程式專案。應用程式 ConsoleEnum 命名。
- 重新命名為 Host.cs,Program.cs,然後將程式碼取代下列程式碼。
附註在 Visual 的 Studio.NET 2003年中重新命名為 Host.cs Class1.cs
using System;
namespace ConsoleEnum
{
class host
{
[STAThread]
static void Main(string[] args)
{
// Create an arary 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();
}
}
}
- 將類別加入至專案。命名類別 汽車。
- 在 [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();
}
}
}
- 執行專案。 下列的輸出會顯示在 [主控台] 視窗:
Array - Unsorted
Ford 1992
Fiat 1988
Buick 1932
Ford 1932
Dodge 1999
Honda 1977
Array - Sorted by Make (Ascending - IComparable)
Buick 1932
Dodge 1999
Fiat 1988
Ford 1932
Ford 1992
Honda 1977
Array - Sorted by Year (Ascending - IComparer)
Ford 1932
Buick 1932
Honda 1977
Fiat 1988
Ford 1992
Dodge 1999
Array - Sorted by Make (Descending - IComparer)
Honda 1977
Ford 1932
Ford 1992
Fiat 1988
Dodge 1999
Buick 1932
Array - Sorted by Year (Descending - IComparer)
Dodge 1999
Ford 1992
Fiat 1988
Honda 1977
Buick 1932
Ford 1932