如何使用 IComparable 接口和 IComparer 接口 Visual C#

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 320727
这篇文章的 Visual Basic.NET 版本,请参见 322025.

在此任务

概要
本分步指南描述如何使用两个接口 ︰ IComparerIComparable。在同一篇文章中讨论这两个接口有两个原因。尽管这两个接口很相似(有着相似的名字),也常常被一起使用,但是它们各自的作用却不同。

如果您已经有一个支持IComparer的类型 (如字符串整数) 的数组,你可以对这个数组进行排序而不提供任何显式引用到IComparer。在这种情况下,数组中的元素强制转换为IComparer (Comparer.Default) 为您的默认实现。但是,如果您想要为您自定义的对象提供排序或比较功能,则必须实现一个或这两种接口。

这篇文章中引用了以下.NET Framework 类库命名空间 ︰
System.Collections
back to the top

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是因为选择进行比较的属性是一个字符串。

back to the top

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();}				
在此示例中,对象用作第二个参数时调用重载接受IComparerArray.Sort方法。IComparer的使用并不限于阵列。它接受作为参数的多个不同的集合和控件类。

back to the top

分步示例

下面的示例演示如何使用这些接口。为了演示IComparerIComparable,创建名为car类。Car对象具有制造年度属性。升序排序字段启用为使通过IComparable接口,并且在进行降序排序字段启用通过IComparer接口。通过使用IComparer属性提供了同时升序和降序排序。
  1. 在 Visual C#,创建新的控制台应用程序项目。命名应用程序 ConsoleEnum。
  2. 重命名为 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();      }   }}					
  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 - UnsortedFord            1992Fiat            1988Buick           1932Ford            1932Dodge           1999Honda           1977Array - Sorted by Make (Ascending - IComparable)Buick           1932Dodge           1999Fiat            1988Ford            1932Ford            1992Honda           1977Array - Sorted by Year (Ascending - IComparer)Ford            1932Buick           1932Honda           1977Fiat            1988Ford            1992Dodge           1999Array - Sorted by Make (Descending - IComparer)Honda           1977Ford            1932Ford            1992Fiat            1988Dodge           1999Buick           1932Array - Sorted by Year (Descending - IComparer)Dodge           1999Ford            1992Fiat            1988Honda           1977Buick           1932Ford            1932					
back to the top

警告:本文已自动翻译

属性

文章 ID:320727 - 上次审阅时间:06/12/2016 10:39:00 - 修订版本: 4.0

Microsoft Visual C# 2008 Express Edition, Microsoft Visual C# 2005 Express Edition

  • kbsweptvs2008 kbhowtomaster kbmt KB320727 KbMtzh
反馈