IComparable.CompareTo(Object) 方法

定义

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

C#
public int CompareTo(object obj);
C#
public int CompareTo(object? obj);

参数

obj
Object

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

返回

一个值,该值指示所比较对象的相对顺序。 返回值具有以下含义:

价值 意义
小于零 此实例在排序顺序 obj 之前。
此实例的排序顺序与 obj相同。
大于零 此实例按排序顺序遵循 obj

例外

obj 的类型与此实例不同。

示例

下面的示例演示如何使用 CompareTo 将实现 IComparableTemperature 对象与其他对象进行比较。 Temperature 对象只需包装对 Int32.CompareTo 方法的调用即可实现 CompareTo

C#
using System;
using System.Collections;

public class Temperature : IComparable
{
    // The temperature value
    protected double temperatureF;

    public int CompareTo(object obj) {
        if (obj == null) return 1;

        Temperature otherTemperature = obj as Temperature;
        if (otherTemperature != null)
            return this.temperatureF.CompareTo(otherTemperature.temperatureF);
        else
           throw new ArgumentException("Object is not a Temperature");
    }

    public double Fahrenheit
    {
        get
        {
            return this.temperatureF;
        }
        set 
        {
            this.temperatureF = value;
        }
    }

    public double Celsius
    {
        get
        {
            return (this.temperatureF - 32) * (5.0/9);
        }
        set
        {
            this.temperatureF = (value * 9.0/5) + 32;
        }
    }
}

public class CompareTemperatures
{
   public static void Main()
   {
      ArrayList temperatures = new ArrayList();
      // Initialize random number generator.
      Random rnd = new Random();

      // Generate 10 temperatures between 0 and 100 randomly.
      for (int ctr = 1; ctr <= 10; ctr++)
      {
         int degrees = rnd.Next(0, 100);
         Temperature temp = new Temperature();
         temp.Fahrenheit = degrees;
         temperatures.Add(temp);
      }

      // Sort ArrayList.
      temperatures.Sort();

      foreach (Temperature temp in temperatures)
         Console.WriteLine(temp.Fahrenheit);
   }
}
// The example displays the following output to the console (individual
// values may vary because they are randomly generated):
//       2
//       7
//       16
//       17
//       31
//       37
//       58
//       66
//       72
//       95

注解

CompareTo 方法由可以排序或排序其值的类型实现。 它由非泛型集合对象(如 Array.Sort)的方法自动调用,以便对数组的每个成员进行排序。 如果自定义类或结构未实现 IComparable,则无法对成员进行排序,排序操作可以引发 InvalidOperationException

此方法只是一个定义,必须由特定的类或值类型实现才能生效。 返回值节中指定的比较的含义(“前面”、“发生于同一位置”和“follows”)取决于特定实现。

根据定义,任何对象都会比较大于(或关注)null,两个 null 引用相互比较相等。

参数 obj必须与实现此接口的类或值类型相同;否则,将引发 ArgumentException

实施者说明

对于对象 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) 必须返回与“x”和“y”相同的符号的值。

调用方说明

使用 CompareTo(Object) 方法确定类实例的排序。

适用于

产品 版本
.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 1.1, 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

另请参阅