IComparable.CompareTo(Object) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
将当前实例与同一类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例在排序顺序中是位于排序顺序中的同一位置、之后还是位于同一位置。
public:
int CompareTo(System::Object ^ obj);
public int CompareTo(object obj);
public int CompareTo(object? obj);
abstract member CompareTo : obj -> int
Public Function CompareTo (obj As Object) As Integer
参数
- obj
- Object
要与此实例进行比较的对象。
返回
一个值,该值指示所比较对象的相对顺序。 返回值具有以下含义:
| 值 | 意义 |
|---|---|
| 小于零 | 此实例位于排序顺序之前 obj 。
|
| 零 | 此实例的排序顺序与排序顺序 obj相同。
|
| 大于零 | 此实例按排序顺序执行 obj 。
|
例外
obj 与此实例的类型不同。
示例
下面的示例演示如何CompareTo将实现Temperature的对象与另一个IComparable对象进行比较。 对象Temperature只需包装对方法的CompareTo调用即可实现Int32.CompareTo。
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 由可排序或排序其值的类型实现。 它由非泛型集合对象的方法(例如 Array.Sort)自动调用,以便对数组的每个成员进行排序。 如果自定义类或结构未实现IComparable,则无法对成员进行排序,排序操作可以引发 。InvalidOperationException
此方法只是一个定义,必须由特定的类或值类型实现才能生效。 返回值节中指定的比较的含义(“前面”、“发生于同一位置”和“follows”)取决于特定实现。
根据定义,任何对象都比较大于(或后跟), 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)使用该方法确定类实例的排序。