<script type="text/javascript">loadTOCNode(1, 'summary');</script>
本文介紹使用兩個接口: IComparer 和 IComparable 。 同一項目中討論這些接口有兩個原因。 這些接口常用一起, 和雖然接口很相似 (并具有類似名稱), 它們提供不同用途。
如果有數(shù)組類型 (如 字符串 或 整數(shù) ) 已經(jīng)支持 IComparer , 則不提供任何顯式引用到 IComparer 可排序該數(shù)組。 數(shù)組的元素此時, 都轉(zhuǎn)換為 IComparer ( Comparer.Default ) 的默認(rèn)實現(xiàn)對。 但是, 如果要提供排序或比較功能對于您自定義對象, 必須實現(xiàn)任一或兩個這些接口。
本文中引用 .NETFrameworkClassLibrary 下列命名空間:
System.Collections
回到頂端
IComparable
<script type="text/javascript">loadTOCNode(2, 'summary');</script> 角色是 IComparable 是以提供方法來比較兩個特定類型的對象。 這是必需如果要為您對象提供任何排序功能。 提供默認(rèn)排序次序?qū)δ鷮ο罂醋魇?IComparable 。 例如, 如果有對象的您類型, 數(shù)組并調(diào)用該數(shù)組, 上 排序 方法 IComparable 提供對象比較期間排序。 當(dāng)實現(xiàn) IComparable 接口, 您必須實現(xiàn) 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);
}
方法中比較是取決于正在進(jìn)行比較, 值數(shù)據(jù)類型不同。 此示例中使用 String.Compare 因為屬性是用于比較選擇是字符串。
回到頂端
IComparer
<script type="text/javascript">loadTOCNode(2, 'summary');</script> 角色的 IComparer 旨在提供其他比較機(jī)制。 例如, 您可能希望提供排序是按幾個字段或?qū)傩? 類升序和降序?qū)ν蛔侄? 或兩者
使用 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 方法要求第三級比較。 1, 0 或 - 1 是返回根據(jù)一個值是大于、, 等于或小于另一個。 通過此方法中切換邏輯運算符更改排序次序 (升序或降序)。
第二步是要返回您 IComparer 對象的一個實例方法聲明:
public static IComparer sortYearAscending()
{
return (IComparer) new sortYearAscendingHelper();
}
當(dāng)調(diào)用重載 Array.Sort 方法接受 IComparer 在本示例, 對象用作第二個參數(shù)。 使用 IComparer 不僅限于數(shù)組。 它被接受多種不同集合和控件類中以參數(shù)形式。
回到頂端
分步示例
<script type="text/javascript">loadTOCNode(2, 'summary');</script> 以下示例演示使用這些接口。 為了演示 IComparer 和 IComparable , 創(chuàng)建一個名為 汽車 類。 汽車 對象具有 使 和 年 屬性。 有關(guān)通過 IComparable 接口, 啟用 使 字段和通過 IComparer 接口啟用對 使 字段降序排序升序排序。 為通過使用的 IComparer 年 屬性提供了升序和降序排序。
1.
|
Visual C#, 中新建控制臺應(yīng)用程序項目。 名稱 ConsoleEnum 應(yīng)用程序。
|
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.
|
運行項目。 以下輸出出現(xiàn)在控制臺窗口:
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
|
回到頂端
本文轉(zhuǎn)自:
http://support.microsoft.com/kb/320727