Wie Sie die IComparable und IComparer-Schnittstellen in Visual C# nutzen können

Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 320727
Eine Visual Basic .NET Version dieses Artikels finden Sie unter 322025.

IN DIESER AUFGABE

Zusammenfassung
Dieser Artikel beschreibt die Verwendung von zwei Schnittstellen: IComparer und IComparable. Diese Schnittstellen werden aus zwei Gründen in diesem Artikel erläutert. Diese Schnittstellen werden häufig zusammen verwendet, und obwohl sich die Schnittstellen ähneln (und einen ähnlichen Namen haben), werden sie für andere Zwecke verwendet.

Wenn Sie ein Array von Typen (z. B. Zeichenfolge oder ganze Zahl) bereits IComparerunterstützt, können Sie ohne jede ausdrücklich IComparerArray sortieren. In diesem Fall werden die Elemente des Arrays in die standardmäßige Implementierung von IComparer (Comparer.Default) umgewandelt. Jedoch wenn Sie sortieren oder Vergleich Funktion für benutzerdefinierte Objekte bereitstellen möchten, müssen Sie eine oder beide der folgenden Schnittstellen implementieren.

In diesem Artikel auf den folgende.NET Framework-Klassenbibliothek Namespace verweist:
System.Collections
back to the top

IComparable

Die Rolle von IComparable ist eine Methode zum Vergleich zweier Objekte eines bestimmten Typs. Dies ist erforderlich, wenn Sie eine Sortier Funktion für Ihr Objekt bereitstellen möchten. Stellen Sie sich IComparable als Anbieter einer Standardsortierreihenfolge für Ihre Objekte vor. Wenn Sie beispielsweise ein Array von Objekten Ihres Typs haben und Sie die Sort -Methode für dieses Array aufrufen, bietet IComparable den Vergleich von Objekten während der Sortierung an. Wenn Sie die IComparable -Schnittstelle implementieren möchten, müssen Sie die CompareTo -Methode wie folgt implementieren:
// Implement IComparable CompareTo method - provide default sort order.int IComparable.CompareTo(object obj){   car c=(car)obj;   return String.Compare(this.make,c.make);}				
Der Vergleich in der Methode ist abhängig von dem Datentyp des Werts, der verglichen wird, unterschiedlich. In diesem Beispiel wird String.Compare verwendet, da die Eigenschaft für diesen Vergleich vom Typ String ist.

back to the top

IComparer

Die Rolle von IComparer ist, zusätzliche VergleichsmMechanismen anzubieten. Beispielsweise möchten Sie die Sortierung Ihrer Klasse nach mehreren Feldern oder Eigenschaften anbieten, oder aufsteigende und absteigende Sortierung nach demselben Feld, oder beides.

Mit IComparer ist ein zweistufiger Prozess. Zuerst deklarieren Sie eine Klasse, die implementiert IComparer, und implementieren Sie die Methode Vergleichen :
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;   }}				
Beachten Sie, dass IComparer.Compare Methode einen dritten Vergleich erfordert. Je nachdem, ob ein Wert größer als, gleich oder kleiner als die andere ist 1, 0 oder-1 zurückgegeben. Wechseln Sie die logischen Operatoren in dieser Methode kann die Sortierreihenfolge (aufsteigend oder absteigend) geändert werden.

Im zweite Schritt wird eine Methode deklariert, die eine Instanz des Objekts IComparer zurückgibt:
public static IComparer sortYearAscending(){         return (IComparer) new sortYearAscendingHelper();}				
In diesem Beispiel wird das Objekt beim Aufrufen überladenen Array.Sort -Methode, die IComparerakzeptiert als zweites Argument verwendet. Die Verwendung von IComparer ist nicht auf Arrays. Es wird in eine Reihe von anderen Auflistung und Klassen als Argument akzeptiert.

back to the top

Schrittweises Beispiel

Das folgende Beispiel veranschaulicht die Verwendung dieser Schnittstellen. Zur Veranschaulichung IComparer und IComparablewird eine Klasse namens Auto erstellt. Das Auto-Objekt verfügt über die Eigenschaften Hersteller und Jahr. Aufsteigend für Stellen Feld aktiviert IComparable -Schnittstelle und eine absteigende Sortierung Stellen Feld über die Schnittstelle IComparer aktiviert. Die Year -Eigenschaft durch IComparersind aufsteigender und absteigender vorgesehen.
  1. In Visual C#, erstellen Sie ein neues Konsolenanwendungsprojekt. Name der Anwendung ConsoleEnum.
  2. Benennen Sie Program.cs als Host.cs, und Ersetzen Sie den Code durch den folgenden Code.

    Hinweis Benennen Sie Class1.cs in Visual Studio .NET 2003 Host.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. Eine Klasse zum Projekt hinzufügen Name der Klasse Auto.
  4. Ersetzen Sie den Code in Car.cs durch Folgendes:
    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. Führen Sie das Projekt aus. Im Konsolenfenster wird die folgende Ausgabe angezeigt:
    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

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 320727 – Letzte Überarbeitung: 06/11/2016 04:18:00 – Revision: 17.0

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

  • kbsweptvs2008 kbhowtomaster kbmt KB320727 KbMtde
Feedback