IComparable 接口
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
定义由值类型或类实现的特定于类型的通用比较方法,旨在对其实例进行排序。
public interface class IComparablepublic interface IComparable[System.Runtime.InteropServices.ComVisible(true)]
public interface IComparabletype IComparable = interface[<System.Runtime.InteropServices.ComVisible(true)>]
type IComparable = interfacePublic Interface IComparable- 派生
- 属性
示例
以下示例演示了实现 IComparable 和必备 CompareTo 方法。
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
open System
open System.Collections
type Temperature() =
    // The temperature value
    let mutable temperatureF = 0.
    interface IComparable with
        member _.CompareTo(obj) =
            match obj with 
            | null -> 1
            | :? Temperature as other -> 
                temperatureF.CompareTo other.Fahrenheit
            | _ ->
                invalidArg (nameof obj) "Object is not a Temperature"
    member _.Fahrenheit 
        with get () =
            temperatureF
        and set (value) = 
            temperatureF <- value
    member _.Celsius
        with get () =
            (temperatureF - 32.) * (5. / 9.)
        and set (value) =
            temperatureF <- (value * 9. / 5.) + 32.
let temperatures = ResizeArray()
// Initialize random number generator.
let rnd = Random()
// Generate 10 temperatures between 0 and 100 randomly.
for _ = 1 to 10 do
    let degrees = rnd.Next(0, 100)
    let temp = Temperature(Fahrenheit=degrees)
    temperatures.Add temp
// Sort ResizeArray.
temperatures.Sort()
for temp in temperatures do
    printfn $"{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(Object)该方法指示当前实例在排序顺序中的位置是之前、之后还是与同一类型的第二个对象相同。 实例的 IComparable 实现由方法(如 Array.Sort 和 ArrayList.Sort)自动调用。
方法的 CompareTo(Object) 实现必须返回三个值中的一个 Int32 值,如下表所示。
| “值” | 含义 | 
|---|---|
| 小于零 | 当前实例位于排序顺序中由方法指定的 CompareTo 对象之前。 | 
| 零 | 此当前实例在排序顺序中与方法指定的 CompareTo 对象位于同一位置。 | 
| 大于零 | 此当前实例遵循排序顺序中由方法指定的 CompareTo 对象。 | 
所有数值类型 ((如Int32和Double) 实现IComparableStringChar)和DateTime。 自定义类型还应提供自己的实现 IComparable ,以便对对象实例进行排序或排序。
方法
| CompareTo(Object) | 将当前实例与同一类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例在排序顺序中的位置是位于另一个对象之前、之后还是与其位置相同。 |