概要
本文介紹使用兩個介面: IComparer 和 IComparable 。 同一項目中討論這些介面有兩個原因。 這些介面常用一起, 和雖然介面很相似 (並具有類似名稱), 它們提供不同用途。
如果有數群組類型 (如 字串 或 整數 ) 已經支援 IComparer , 則不提供任何顯式引用到 IComparer 可排序該數組。 數組的元素此時, 都轉換為 IComparer ( Comparer.Default ) 的預設實現對。 但是, 如果要提供排序或比較功能對於您自訂對象, 必須實現任一或兩個這些介面。
本文中引用 .NETFrameworkClassLibrary 下列命名空間:
System.Collections IComparable
角色是 IComparable 是以提供方法來比較兩個特定類型的對象。 這是必需如果要為您對象提供任何排序功能。 提供預設排序次序對您對象看作是 IComparable 。 例如, 如果有對象的您類型, 數組並調用該數組, 上 排序 方法 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 , 並然後實現 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 方法要求第三級比較。 1, 0 或 - 1 是返回根據一個值是大於、, 等於或小於另一個。 通過此方法中切換邏輯運算子更改排序次序 (升序或降序)。
第二步是要返回您 IComparer 對象的一個執行個體方法聲明:
public static IComparer sortYearAscending()
{
return (IComparer) new sortYearAscendingHelper();
}
當調用重載 Array.Sort 方法接受 IComparer 在本樣本, 對象用作第二個參數。 使用 IComparer 不僅限於數組。 它被接受多種不同集合和控制項類中以參數形式。
分步樣本
以下樣本示範使用這些介面。 為了示範 IComparer 和 IComparable , 建立一個名為 汽車 類。 汽車 對象具有 使 和 年 屬性。 有關通過 IComparable 介面, 啟用 使 欄位和通過 IComparer 介面啟用對 使 欄位降序排序升序排序。 為通過使用的 IComparer 年 屬性提供了升序和降序排序。
1. |
Visual C#, 中建立控制台應用程式項目。 名稱 ConsoleEnum 應用程式。 |
2. |
命名作為 Host.cs, Class, 然後用以下代碼替換代碼。 注意 重作為 Host.cs 入 Visual Studio 2005, 命名 Program.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(); } } }
|
3. |
向項目添加類。 命名類 汽車 。 |
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. |
運行項目。 以下輸出出現在控制台視窗:
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
|