IComparable.CompareTo(Object) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Compara a instância atual com outro objeto do mesmo tipo e devolve um número inteiro que indica se a instância atual precede, segue ou ocorre na mesma posição na sequência de ordenação que o outro objeto.
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
Parâmetros
- obj
- Object
Um objeto a ser comparado com essa instância.
Retornos
Um valor que indica a ordem relativa dos objetos que estão sendo comparados. O valor retornado tem estes significados:
| Valor | Significado |
|---|---|
| Menor que zero | Essa instância precede obj na ordem de classificação.
|
| Zero | Essa instância ocorre na mesma posição na ordem de classificação que obj.
|
| Maior que zero | Essa instância segue obj na ordem de classificação.
|
Exceções
obj não é do mesmo tipo que essa instância.
Exemplos
O exemplo a seguir ilustra o uso para CompareTo comparar um Temperature objeto que está implementando IComparable com outro objeto. O Temperature objeto implementa CompareTo simplesmente encapsulando uma chamada para o Int32.CompareTo método.
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
Comentários
O CompareTo método é implementado por tipos cujos valores podem ser ordenados ou classificados. Ele é chamado automaticamente por métodos de objetos de coleção não genéricos, como Array.Sort, para ordenar cada membro da matriz. Se uma classe ou estrutura personalizada não implementar IComparable, seus membros não poderão ser ordenados e a operação de classificação poderá gerar um InvalidOperationException.
Esse método é apenas uma definição e deve ser implementado por um tipo de classe ou valor específico para ter efeito. O significado das comparações especificadas na seção Valor retornado ("precede", "ocorre na mesma posição que" e "segue") depende da implementação específica.
Por definição, qualquer objeto é comparado maior que (ou a seguir) nulle duas referências nulas são comparadas entre si.
O parâmetro deve objser o mesmo tipo que a classe ou o tipo de valor que implementa essa interface; caso contrário, um ArgumentException é gerado.
Notas aos Implementadores
Para os objetos A, B e C, o seguinte deve ser verdadeiro:
A.CompareTo(A) deve retornar zero.
Se A.CompareTo(B) retornar zero, deverá B.CompareTo(A) retornar zero.
Se A.CompareTo(B) retornar zero e B.CompareTo(C) retornar zero, deverá A.CompareTo(C) retornar zero.
Se A.CompareTo(B) retornar um valor diferente de zero, deverá B.CompareTo(A) retornar um valor do sinal oposto.
Se A.CompareTo(B) retornar um valor "x" não igual a zero e B.CompareTo(C) retornar um valor "y" do mesmo sinal que "x", deverá A.CompareTo(C) retornar um valor do mesmo sinal que "x" e "y".
Notas aos Chamadores
Use o CompareTo(Object) método para determinar a ordenação de instâncias de uma classe.