Auf Englisch lesen

Teilen über


IComparable<T> Schnittstelle

Definition

Definiert eine allgemeine Vergleichsmethode, die von einem Werttyp oder einer Klasse für die Erstellung einer typspezifischen Vergleichsmethode zum Ordnen oder Sortieren von Instanzen implementiert wird.

C#
public interface IComparable<in T>
C#
public interface IComparable<T>

Typparameter

T

Der Typ der zu vergleichenden Objekte.

Dieser Typparameter ist kontravariant. Das bedeutet, dass Sie entweder den angegebenen Typ oder einen weniger abgeleiteten Typ verwenden können. Weitere Informationen zu Kovarianz und Kontravarianz finden Sie unter Kovarianz und Kontravarianz in Generics.
Abgeleitet

Beispiele

Im folgenden Beispiel wird die Implementierung IComparable<T> eines einfachen Temperature Objekts veranschaulicht. Im Beispiel wird eine SortedList<TKey,TValue> Auflistung von Zeichenfolgen mit Temperature Objektschlüsseln erstellt und der Liste aus der Sequenz mehrere Temperaturen und Zeichenfolgen hinzugefügt. Im Aufruf der Methode verwendet die SortedList<TKey,TValue> Auflistung die IComparable<T> Implementierung zum Sortieren der Add Listeneinträge, die dann in der Reihenfolge der steigenden Temperatur angezeigt werden.

C#
using System;
using System.Collections.Generic;

public class Temperature : IComparable<Temperature>
{
    // Implement the generic CompareTo method with the Temperature
    // class as the Type parameter.
    //
    public int CompareTo(Temperature other)
    {
        // If other is not a valid object reference, this instance is greater.
        if (other == null) return 1;

        // The temperature comparison depends on the comparison of
        // the underlying Double values.
        return m_value.CompareTo(other.m_value);
    }

    // Define the is greater than operator.
    public static bool operator >  (Temperature operand1, Temperature operand2)
    {
       return operand1.CompareTo(operand2) > 0;
    }

    // Define the is less than operator.
    public static bool operator <  (Temperature operand1, Temperature operand2)
    {
       return operand1.CompareTo(operand2) < 0;
    }

    // Define the is greater than or equal to operator.
    public static bool operator >=  (Temperature operand1, Temperature operand2)
    {
       return operand1.CompareTo(operand2) >= 0;
    }

    // Define the is less than or equal to operator.
    public static bool operator <=  (Temperature operand1, Temperature operand2)
    {
       return operand1.CompareTo(operand2) <= 0;
    }

    // The underlying temperature value.
    protected double m_value = 0.0;

    public double Celsius
    {
        get
        {
            return m_value - 273.15;
        }
    }

    public double Kelvin
    {
        get
        {
            return m_value;
        }
        set
        {
            if (value < 0.0)
            {
                throw new ArgumentException("Temperature cannot be less than absolute zero.");
            }
            else
            {
                m_value = value;
            }
        }
    }

    public Temperature(double kelvins)
    {
        this.Kelvin = kelvins;
    }
}

public class Example
{
    public static void Main()
    {
        SortedList<Temperature, string> temps =
            new SortedList<Temperature, string>();

        // Add entries to the sorted list, out of order.
        temps.Add(new Temperature(2017.15), "Boiling point of Lead");
        temps.Add(new Temperature(0), "Absolute zero");
        temps.Add(new Temperature(273.15), "Freezing point of water");
        temps.Add(new Temperature(5100.15), "Boiling point of Carbon");
        temps.Add(new Temperature(373.15), "Boiling point of water");
        temps.Add(new Temperature(600.65), "Melting point of Lead");

        foreach( KeyValuePair<Temperature, string> kvp in temps )
        {
            Console.WriteLine("{0} is {1} degrees Celsius.", kvp.Value, kvp.Key.Celsius);
        }
    }
}
/* This example displays the following output:
      Absolute zero is -273.15 degrees Celsius.
      Freezing point of water is 0 degrees Celsius.
      Boiling point of water is 100 degrees Celsius.
      Melting point of Lead is 327.5 degrees Celsius.
      Boiling point of Lead is 1744 degrees Celsius.
      Boiling point of Carbon is 4827 degrees Celsius.
*/

Hinweise

Diese Schnittstelle wird durch Typen implementiert, deren Werte sortiert oder sortiert werden können und eine stark typierte Vergleichsmethode für die Reihenfolge von Elementen eines generischen Auflistungsobjekts bereitstellt. Beispielsweise kann eine Zahl größer als eine zweite Zahl sein, und eine Zeichenfolge kann in alphabetischer Reihenfolge vor einer anderen angezeigt werden. Es erfordert, dass die Implementierung von Typen eine einzelne Methode definiert, CompareTo(T)die angibt, ob die Position der aktuellen Instanz in der Sortierreihenfolge vor, nach oder identisch mit einem zweiten Objekt desselben Typs ist. In der Regel wird die Methode nicht direkt vom Entwicklercode aufgerufen. Stattdessen wird sie automatisch durch Methoden wie List<T>.Sort() z. B. und Add.

In der Regel implementieren Typen, die eine IComparable<T> Implementierung bereitstellen, auch die IEquatable<T> Schnittstelle. Die IEquatable<T> Schnittstelle definiert die Equals Methode, die die Gleichheit von Instanzen des Implementierungstyps bestimmt.

Die Implementierung der Methode muss eine Int32 von drei Werten zurückgeben, wie in der CompareTo(T) folgenden Tabelle dargestellt.

Wert Bedeutung
Kleiner als 0 (null) Dieses Objekt vor dem objekt, das durch die Methode in der CompareTo Sortierreihenfolge angegeben wird.
Zero Diese aktuelle Instanz tritt in der gleichen Position in der Sortierreihenfolge wie das durch das CompareTo Methodenargument angegebene Objekt auf.
Größer als 0 (null) Diese aktuelle Instanz folgt dem objekt, das durch das Methodenargument in der CompareTo Sortierreihenfolge angegeben wird.

Alle numerischen Typen (zInt32. B. und Double) implementieren IComparable<T>, wie StringCharauch , und DateTime. Benutzerdefinierte Typen sollten auch eine eigene Implementierung IComparable<T> bereitstellen, um Objektinstanzen zu sortieren oder zu sortieren.

Hinweise für Ausführende

Ersetzen Sie den Typparameter der IComparable<T> Schnittstelle durch den Typ, der diese Schnittstelle implementiert.

Wenn Sie implementieren, sollten Sie IComparable<T>die op_GreaterThanop_LessThanop_GreaterThanOrEqualop_LessThanOrEqual Werte überladen, die mit CompareTo(T)dem Wert übereinstimmen. Darüber hinaus sollten Sie auch implementieren IEquatable<T>. IEquatable<T> Weitere Informationen finden Sie im Artikel.

Methoden

CompareTo(T)

Vergleicht die aktuelle Instanz mit einem anderen Objekt vom selben Typ und gibt eine ganze Zahl zurück, die angibt, ob die aktuelle Instanz in der Sortierreihenfolge vor oder nach dem anderen Objekt oder an derselben Position auftritt.

Gilt für

Produkt Versionen
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Siehe auch