IComparable.CompareTo(Object) IComparable.CompareTo(Object) IComparable.CompareTo(Object) IComparable.CompareTo(Object) Method

定义

将当前实例与同一类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例在排序顺序中的位置是位于另一个对象之前、之后还是与其位置相同。Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object.

public:
 int CompareTo(System::Object ^ obj);
public int CompareTo (object obj);
abstract member CompareTo : obj -> int
Public Function CompareTo (obj As Object) As Integer

参数

obj
Object Object Object Object

与此实例进行比较的对象。An object to compare with this instance.

返回

一个值,指示要比较的对象的相对顺序。A value that indicates the relative order of the objects being compared. 返回值的含义如下:The return value has these meanings:

“值”Value 含义Meaning
小于零Less than zero 此实例在排序顺序中位于 obj 之前。This instance precedes obj in the sort order.

Zero 此实例在排序顺序中的位置与 obj 相同。This instance occurs in the same position in the sort order as obj.

大于零Greater than zero 此实例在排序顺序中位于 obj 之后。This instance follows obj in the sort order.

异常

obj 不具有与此实例相同的类型。obj is not the same type as this instance.

示例

下面的示例演示如何使用CompareTo进行比较Temperature对象,实现IComparable与另一个对象。The following example illustrates the use of CompareTo to compare a Temperature object implementing IComparable with another object. Temperature对象将实现CompareTo进行简单包装即可调用Int32.CompareTo方法。The Temperature object implements CompareTo by simply wrapping a call to the Int32.CompareTo method.

using namespace System;
using namespace System::Collections;

public ref class Temperature: public IComparable {
   /// <summary>
   /// IComparable.CompareTo implementation.
   /// </summary>
protected:
   // The value holder
   Double m_value;

public:
   virtual Int32 CompareTo( Object^ obj ) {
   
      if (obj == nullptr) return 1;
      
      if ( obj->GetType() == Temperature::typeid ) {
         Temperature^ temp = dynamic_cast<Temperature^>(obj);

         return m_value.CompareTo( temp->m_value );
      }
      throw gcnew ArgumentException(  "object is not a Temperature" );
   }

   property Double Value {
      Double get() {
         return m_value;
      }
      void set( Double value ) {
         m_value = value;
      }
   }

   property Double Celsius  {
      Double get() {
         return (m_value - 32) / 1.8;
      }
      void set( Double value ) {
         m_value = (value * 1.8) + 32;
      }
   }
};

int main()
{
   ArrayList^ temperatures = gcnew ArrayList;
   // Initialize random number generator.
   Random^ rnd = gcnew Random;

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

   // Sort ArrayList.
   temperatures->Sort();
      
   for each (Temperature^ temp in temperatures)
      Console::WriteLine(temp->Value);
   return 0;
}
// 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
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
Imports System.Collections

Public Class Temperature
    Implements IComparable
    ' The temperature value
    Protected temperatureF As Double

    Public Overloads Function CompareTo(ByVal obj As Object) As Integer _
        Implements IComparable.CompareTo
        
        If obj Is Nothing Then Return 1

        Dim otherTemperature As Temperature = TryCast(obj, Temperature)
        If otherTemperature IsNot Nothing Then
            Return Me.temperatureF.CompareTo(otherTemperature.temperatureF)
        Else
           Throw New ArgumentException("Object is not a Temperature")
        End If   
    End Function

    Public Property Fahrenheit() As Double
        Get
            Return temperatureF
        End Get
        Set(ByVal Value As Double)
            Me.temperatureF = Value
        End Set
    End Property

    Public Property Celsius() As Double
        Get
            Return (temperatureF - 32) * (5/9)
        End Get
        Set(ByVal Value As Double)
            Me.temperatureF = (Value * 9/5) + 32
        End Set
    End Property
End Class

Public Module CompareTemperatures
   Public Sub Main()
      Dim temperatures As New ArrayList
      ' Initialize random number generator.
      Dim rnd As New Random()
      
      ' Generate 10 temperatures between 0 and 100 randomly.
      For ctr As Integer = 1 To 10
         Dim degrees As Integer = rnd.Next(0, 100)
         Dim temp As New Temperature
         temp.Fahrenheit = degrees
         temperatures.Add(temp)   
      Next

      ' Sort ArrayList.
      temperatures.Sort()
      
      For Each temp As Temperature In temperatures
         Console.WriteLine(temp.Fahrenheit)
      Next      
   End Sub
End Module
' 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可排序的值类型实现方法。The CompareTo method is implemented by types whose values can be ordered or sorted. 它将自动调用非泛型集合对象的方法如Array.Sort、 进行排序数组的每个成员。It is called automatically by methods of non-generic collection objects, such as Array.Sort, to order each member of the array. 如果自定义类或结构不实现IComparable,其成员不能进行排序和排序操作可能会引发InvalidOperationExceptionIf a custom class or structure does not implement IComparable, its members cannot be ordered and the sort operation can throw an InvalidOperationException.

此方法只是一个定义,必须由特定类或值类型产生影响。This method is only a definition and must be implemented by a specific class or value type to have effect. 部分 ("之前"、"中出现的相同位置作为",和"后面") 取决于特定实现的返回值中指定的比较的含义。The meaning of the comparisons specified in the Return Value section ("precedes", "occurs in the same position as", and "follows") depends on the particular implementation.

根据定义,任何对象进行比较大于 (或遵循) null,两个 null 引用的比较结果相等的。By definition, any object compares greater than (or follows) null, and two null references compare equal to each other.

参数, obj,必须是与类相同的类型或值类型,可实现此接口; 否则为ArgumentException引发。The parameter, obj, must be the same type as the class or value type that implements this interface; otherwise, an ArgumentException is thrown.

实施者说明

对于对象 A、 B 和 C,必须满足以下条件:For objects A, B and C, the following must be true: A.CompareTo(A)必须返回零。A.CompareTo(A) must return zero.

如果A.CompareTo(B)返回零,则B.CompareTo(A)必须返回零。If A.CompareTo(B) returns zero, then B.CompareTo(A) must return zero.

如果A.CompareTo(B)将返回零和B.CompareTo(C)返回零,则A.CompareTo(C)必须返回零。If A.CompareTo(B) returns zero and B.CompareTo(C) returns zero, then A.CompareTo(C) must return zero.

如果A.CompareTo(B)返回的值不为零,然后B.CompareTo(A)必须返回符号相反的值。If A.CompareTo(B) returns a value other than zero, then B.CompareTo(A) must return a value of the opposite sign.

如果A.CompareTo(B)返回的值x不等于零,和B.CompareTo(C)返回的值y的相同的符号x,然后a。CompareTo(C)必须返回相同的符号的值xyIf A.CompareTo(B) returns a value x not equal to zero, and B.CompareTo(C) returns a value y of the same sign as x, then A.CompareTo(C) must return a value of the same sign as x and y.

调用方说明

使用CompareTo(Object)方法来确定某个类的实例的排序。Use the CompareTo(Object) method to determine the ordering of instances of a class.

适用于

另请参阅