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

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 über ein Array von Typen (z. B. Zeichenfolge oder ganze Zahl), die bereits IComparerunterstützen verfügen, dann können Sie dieses Array ohne einen expliziten Verweis auf IComparer sortieren. In diesem Fall werden die Elemente des Arrays in die standardmäßige Implementierung von IComparer (Comparer.Default) umgewandelt. Wenn Sie jedoch sortieren oder die Vergleichsfunktion für benutzerdefinierte Objekte bereitstellen möchten, müssen Sie eine oder beide dieser Schnittstellen implementieren.

In diesem Artikel auf den folgende.NET Framework-Klassenbibliothek Namespace verweist:

System.Collections

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.

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.

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 - 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

Eigenschaften

Artikelnummer: 320727 – Letzte Überarbeitung: 16.01.2017 – Revision: 1

Feedback