IComparable<T> Interfejs

Definicja

Definiuje metodę porównania uogólnionego, która implementuje typ wartości lub klasę w celu utworzenia metody porównania specyficznej dla typu do porządkowania lub sortowania jego wystąpień.

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

Parametry typu

T

Typ obiektu do porównania.

Ten parametr typu jest kontrawariantny. Oznacza to, że możesz użyć typu, który został przez Ciebie określony, lub dowolnego typu, który jest mniej pochodny. Aby uzyskać więcej informacji o kowariancji i kontrawariancji, zobacz Kowariancja i kontrawariancja w typach ogólnych.
Pochodne

Przykłady

Poniższy przykład ilustruje implementację IComparable<T> prostego Temperature obiektu. W przykładzie tworzona jest SortedList<TKey,TValue> kolekcja ciągów z kluczami Temperature obiektów i dodaje kilka par temperatury i ciągów do listy poza sekwencją. W wywołaniu Add metody SortedList<TKey,TValue> kolekcja używa IComparable<T> implementacji do sortowania wpisów listy, które są następnie wyświetlane w kolejności rosnącej temperatury.

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.
*/

Uwagi

Ten interfejs jest implementowany przez typy, których wartości można porządkować lub sortować i zapewnia silnie typizowaną metodę porównywania elementów członkowskich ogólnego obiektu kolekcji. Na przykład jedna liczba może być większa niż druga, a jeden ciąg może występować w kolejności alfabetycznej przed drugim. Wymaga to, aby zaimplementowanie typów zdefiniowało pojedynczą metodę , CompareTo(T)która wskazuje, czy pozycja bieżącego wystąpienia w kolejności sortowania jest wcześniej, po, czy taka sama jak drugi obiekt tego samego typu. Zazwyczaj metoda nie jest wywoływana bezpośrednio z kodu dewelopera. Zamiast tego jest wywoływana automatycznie przez metody, takie jak List<T>.Sort() i Add.

Zazwyczaj typy, które zapewniają implementację IComparable<T> , również implementują IEquatable<T> interfejs. Interfejs IEquatable<T> definiuje metodę Equals , która określa równość wystąpień typu implementowania.

Implementacja CompareTo(T) metody musi zwrócić Int32 jedną z trzech wartości, jak pokazano w poniższej tabeli.

Wartość Znaczenie
Mniej niż zero Ten obiekt poprzedza obiekt określony przez metodę CompareTo w kolejności sortowania.
Zero To bieżące wystąpienie występuje w tej samej pozycji w kolejności sortowania, co obiekt określony przez CompareTo argument metody.
Większe od zera To bieżące wystąpienie jest zgodne z obiektem CompareTo określonym przez argument metody w kolejności sortowania.

Wszystkie typy liczbowe (takie jak Int32 i Double) implementują IComparable<T>funkcje , podobnie jak String, Chari DateTime. Typy niestandardowe powinny również udostępniać własną implementację IComparable<T> , aby umożliwić porządkowenie lub sortowanie wystąpień obiektów.

Uwagi dotyczące implementowania

Zastąp parametr type interfejsu IComparable<T> typem implementujący ten interfejs.

W przypadku implementacji IComparable<T>należy przeciążyć op_GreaterThanoperatory , op_GreaterThanOrEqual, op_LessThani op_LessThanOrEqual , aby zwracały wartości zgodne z .CompareTo(T) Ponadto należy również zaimplementować funkcję IEquatable<T>. Zapoznaj się z artykułem, IEquatable<T> aby uzyskać pełne informacje.

Metody

CompareTo(T)

Porównuje bieżące wystąpienie z innym obiektem tego samego typu i zwraca liczbę całkowitą, która wskazuje, czy bieżące wystąpienie poprzedza, następuje po lub występuje w tym samym położeniu, co inny obiekt w porządku sortowania.

Dotyczy

Produkt Wersje
.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

Zobacz też