使用英语阅读

通过


IComparable<T> 接口

定义

定义由值类型或类实现的通用比较方法,旨在创建特定于类型的比较方法以对实例进行排序。

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

类型参数

T

要比较的对象的类型。

这是逆变类型参数。 即,可以使用指定的类型,也可以使用派生程度较低的任何类型。 有关协变和逆变的详细信息,请参阅泛型中的协变和逆变
派生

示例

以下示例演示了简单 Temperature 对象的 实现IComparable<T>。 该示例使用对象键创建字符串 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)该方法指示当前实例在排序顺序中的位置是之前、之后还是与同一类型的第二个对象相同。 通常,不会直接从开发人员代码调用 方法。 相反,它由 和 AddList<T>.Sort()方法自动调用。

通常,提供 IComparable<T> 实现的类型也会实现 IEquatable<T> 接口。 接口 IEquatable<T> 定义 Equals 方法,该方法确定实现类型的实例的相等性。

方法的 CompareTo(T) 实现必须返回具有三个 Int32 值之一的 ,如下表所示。

“值” 含义
小于零 此对象在排序顺序中由 CompareTo 方法指定的 对象之前。
此当前实例在排序顺序中与方法参数指定的 CompareTo 对象位于同一位置。
大于零 此当前实例遵循排序顺序中方法参数指定的 CompareTo 对象。

所有数值类型 ((如 Int32Double) )String实现 IComparable<T>、、Char、 和 DateTime。 自定义类型还应提供其自己的 实现, IComparable<T> 以便对对象实例进行排序或排序。

实施者说明

将 接口的类型 IComparable<T> 参数替换为实现此接口的类型。

如果实现 IComparable<T>,则应重载 op_GreaterThanop_GreaterThanOrEqualop_LessThanop_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
.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

另请参阅