Прочитать на английском

Поделиться через


IComparable<T> Интерфейс

Определение

Определяет обобщенный метод сравнения, который реализуется типом значения или классом для создания метода сравнения с целью упорядочения или сортировки экземпляров.

public interface IComparable<in T>
public interface IComparable<T>

Параметры типа

T

Тип объектов для сравнения.

Это контравариантный параметр типа. Это означает, что вы можете использовать любой из указанных типов или любой тип, являющийся менее производным. Дополнительные сведения о ковариантности и контрвариантности см. в статье Ковариантность и контрвариантность в универсальных шаблонах.
Производный

Примеры

В следующем примере показана IComparable<T> реализация для простого Temperature объекта . В примере создается SortedList<TKey,TValue> коллекция строк с Temperature ключами объектов и добавляется несколько пар температур и строк в список вне последовательности. В вызове Add метода SortedList<TKey,TValue> коллекция использует реализацию IComparable<T> для сортировки записей списка, которые затем отображаются в порядке повышения температуры.

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

Комментарии

Этот интерфейс реализуется типами, значения которых можно упорядочить или отсортировать, и предоставляет строго типизированный метод сравнения для упорядочения членов универсального объекта коллекции. Например, одно число может быть больше второго, и одна строка может отображаться в алфавитном порядке перед другим. Для этого требуется, чтобы реализующие типы определяли один метод , который указывает, CompareTo(T)находится ли позиция текущего экземпляра в порядке сортировки до, после или совпадает с положением второго объекта того же типа. Как правило, метод не вызывается непосредственно из кода разработчика. Вместо этого он вызывается автоматически с помощью таких методов, как List<T>.Sort() и Add.

Как правило, типы, обеспечивающие реализацию IComparable<T> , также реализуют IEquatable<T> интерфейс . Интерфейс IEquatable<T> определяет Equals метод , который определяет равенство экземпляров реализующего типа.

Реализация CompareTo(T) метода должна возвращать Int32 объект , имеющий одно из трех значений, как показано в следующей таблице.

Значение Значение
Меньше нуля Этот объект предшествует объекту, указанному методом CompareTo в порядке сортировки.
Нуль Этот текущий экземпляр находится в той же позиции в порядке сортировки, что и объект, указанный аргументом CompareTo метода .
Больше нуля Этот текущий экземпляр следует за объектом, указанным аргументом CompareTo метода в порядке сортировки.

Все числовые типы (например, Int32 и ) реализуют IComparable<T>, а также String, Charи DateTimeDouble. Пользовательские типы также должны предоставлять собственную реализацию для упорядочения IComparable<T> или сортировки экземпляров объектов.

Примечания для тех, кто реализует этот метод

Замените параметр IComparable<T> type интерфейса типом, реализующим этот интерфейс.

При реализации IComparable<T>следует перегружать op_GreaterThanоператоры , op_GreaterThanOrEqual, op_LessThanи op_LessThanOrEqual , чтобы возвращать значения, согласованные с CompareTo(T). Кроме того, следует также реализовать .IEquatable<T> Полные сведения см. в IEquatable<T> этой статье.

Методы

CompareTo(T)

Сравнивает текущий экземпляр с другим объектом того же типа и возвращает целое число, которое показывает, расположен ли текущий экземпляр перед, после или на той же позиции в порядке сортировки, что и другой объект.

Применяется к

Продукт Версии
.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, 8, 9, 10
.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, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

См. также раздел