IComparable<T>.CompareTo(T) 方法

定义

将当前实例与同一类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例在排序顺序中的位置是位于另一个对象之前、之后还是与其位置相同。

C#
public int CompareTo(T other);
C#
public int CompareTo(T? other);

参数

other
T

与此实例进行比较的对象。

返回

一个值,指示要比较的对象的相对顺序。 返回值的含义如下:

含义
小于零 此实例在排序顺序中位于 other 之前。
此实例在排序顺序中的位置与 other 相同。
大于零 此实例在排序顺序中位于 other 之后。

示例

下面的代码示例演示了简单Temperature对象的 实现IComparable<T>。 该示例使用对象键创建字符串 SortedList<TKey,TValue> 集合 Temperature ,并按顺序向列表中添加几对温度和字符串。 在调用 Add 方法时, SortedList<TKey,TValue> 集合使用 IComparable<T> 实现对列表条目进行排序,然后按温度上升的顺序显示这些条目。

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

注解

CompareTo 提供强类型比较方法,用于对泛型集合对象的成员进行排序。 因此,通常不会直接从开发人员代码调用它。 相反,它由 和 AddList<T>.Sort()方法自动调用。

此方法只是一个定义,必须由特定的类或值类型实现才能生效。 “返回值”部分中指定的比较的含义 (“之前”、“发生在与相同的位置”、“遵循) 取决于特定的实现。

根据定义,任何对象都比较大于 null,两个 null 引用比较相等。

实施者说明

对于对象 A、B 和 C,必须满足以下条件:

A.CompareTo(A) 需要返回零。

如果 A.CompareTo(B) 返回零,则需要 B.CompareTo(A) 返回零。

如果 A.CompareTo(B) 返回零并 B.CompareTo(C) 返回零,则需要 A.CompareTo(C) 返回零。

如果 A.CompareTo(B) 返回除零以外的值,则需要 B.CompareTo(A) 返回相反符号的值。

如果A.CompareTo(B)返回不等于零的值x,并B.CompareTo(C)返回与 相同的符号x的值y,则需要A.CompareTo(C)返回与 和 y相同的符号x的值。

调用方说明

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

另请参阅