Visual C#中如何使用IComparable和IComparer接口
本文同時討論了IComparable和IComparer接口,原因有兩點。這兩個接口經(jīng)常一起使用。雖然接口類似且名稱相似,但它們卻有不同的用途。
原文:Use the IComparable and IComparer interfaces in Visual CSharp
本文介紹了在Visual C#中如何使用IComparer和IComparable接口。
概要
本文同時討論了IComparable和IComparer接口,原因有兩點。這兩個接口經(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??梢酝ㄟ^切換此方法中的邏輯運算符來更改排序順序(升序或降序)。
第二步是聲明一個返回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. 運行項目。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#基礎(chǔ):Equals()與運算符==的區(qū)別分析
本篇文章是對c#中的Equals()與運算符==的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05MessageBox的Buttons和三級聯(lián)動效果
這篇文章主要介紹了MessageBox的Buttons和三級聯(lián)動的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-11-11.net2.0+ Winform項目實現(xiàn)彈出容器層
在實際工作中,如果能像菜單一樣彈出自定義內(nèi)容,會方便很多,比如查詢時,比如下拉列表顯示多列信息時,比如在填寫某個信息需要查看一些信息樹時。這個時候自定義彈出界面就顯的非常重要了2015-08-08c#數(shù)據(jù)綁定之?dāng)?shù)據(jù)轉(zhuǎn)化為信息的示例
這篇文章主要介紹了c#數(shù)據(jù)綁定中的數(shù)據(jù)轉(zhuǎn)化為信息的示例,需要的朋友可以參考下2014-04-04