Leggere in inglese

Condividi tramite


IComparable<T>.CompareTo(T) Metodo

Definizione

Confronta l'istanza corrente con un altro oggetto dello stesso tipo e restituisce un intero che indica se l'istanza corrente precede, segue o si trova nella stessa posizione dell'altro oggetto all'interno dell'ordinamento.

C#
public int CompareTo(T other);
C#
public int CompareTo(T? other);

Parametri

other
T

Oggetto da confrontare con l'istanza.

Restituisce

Valore che indica l'ordine relativo degli oggetti confrontati. Il valore restituito ha i seguenti significati:

Valore Significato
Minore di zero Questa istanza precede other nell'ordinamento.
Zero Questa istanza si presenta nella stessa posizione di other all'interno dell'ordinamento.
Maggiore di zero Questa istanza segue other nei criteri di ordinamento.

Esempio

Nell'esempio di codice seguente viene illustrata l'implementazione di IComparable<T> per un oggetto semplice Temperature . L'esempio crea una SortedList<TKey,TValue> raccolta di stringhe con Temperature chiavi oggetto e aggiunge diverse coppie di temperature e stringhe all'elenco fuori sequenza. Nella chiamata al Add metodo, l'insieme SortedList<TKey,TValue> usa l'implementazione per ordinare le voci dell'elenco IComparable<T> , che vengono quindi visualizzate in ordine di aumento della temperatura.

C#
using System;
using System.Collections.Generic;

public class Temperature : IComparable<Temperature>
{
    // Implement the generic CompareTo method with the Temperature
    // class as the Type parameter.
    //
    public int CompareTo(Temperature other)
    {
        // If other is not a valid object reference, this instance is greater.
        if (other == null) return 1;

        // The temperature comparison depends on the comparison of
        // the underlying Double values.
        return m_value.CompareTo(other.m_value);
    }

    // Define the is greater than operator.
    public static bool operator >  (Temperature operand1, Temperature operand2)
    {
       return operand1.CompareTo(operand2) > 0;
    }

    // Define the is less than operator.
    public static bool operator <  (Temperature operand1, Temperature operand2)
    {
       return operand1.CompareTo(operand2) < 0;
    }

    // Define the is greater than or equal to operator.
    public static bool operator >=  (Temperature operand1, Temperature operand2)
    {
       return operand1.CompareTo(operand2) >= 0;
    }

    // Define the is less than or equal to operator.
    public static bool operator <=  (Temperature operand1, Temperature operand2)
    {
       return operand1.CompareTo(operand2) <= 0;
    }

    // The underlying temperature value.
    protected double m_value = 0.0;

    public double Celsius
    {
        get
        {
            return m_value - 273.15;
        }
    }

    public double Kelvin
    {
        get
        {
            return m_value;
        }
        set
        {
            if (value < 0.0)
            {
                throw new ArgumentException("Temperature cannot be less than absolute zero.");
            }
            else
            {
                m_value = value;
            }
        }
    }

    public Temperature(double kelvins)
    {
        this.Kelvin = kelvins;
    }
}

public class Example
{
    public static void Main()
    {
        SortedList<Temperature, string> temps =
            new SortedList<Temperature, string>();

        // Add entries to the sorted list, out of order.
        temps.Add(new Temperature(2017.15), "Boiling point of Lead");
        temps.Add(new Temperature(0), "Absolute zero");
        temps.Add(new Temperature(273.15), "Freezing point of water");
        temps.Add(new Temperature(5100.15), "Boiling point of Carbon");
        temps.Add(new Temperature(373.15), "Boiling point of water");
        temps.Add(new Temperature(600.65), "Melting point of Lead");

        foreach( KeyValuePair<Temperature, string> kvp in temps )
        {
            Console.WriteLine("{0} is {1} degrees Celsius.", kvp.Value, kvp.Key.Celsius);
        }
    }
}
/* This example displays the following output:
      Absolute zero is -273.15 degrees Celsius.
      Freezing point of water is 0 degrees Celsius.
      Boiling point of water is 100 degrees Celsius.
      Melting point of Lead is 327.5 degrees Celsius.
      Boiling point of Lead is 1744 degrees Celsius.
      Boiling point of Carbon is 4827 degrees Celsius.
*/

Commenti

CompareTo fornisce un metodo di confronto fortemente tipizzato per ordinare membri di un oggetto raccolta generico. A causa di questo, in genere non viene chiamato direttamente dal codice per sviluppatori. Viene invece chiamato automaticamente da metodi come List<T>.Sort() e Add.

Questo metodo è solo una definizione e deve essere implementato da una classe o un tipo di valore specifico per avere effetto. Il significato dei confronti specificati nella sezione Valori restituiti ("precede", "si verifica nella stessa posizione di" e "segue) dipende dall'implementazione specifica.

Per definizione, qualsiasi oggetto confronta più di nulle due riferimenti Null confrontano tra loro uguali.

Note per gli implementatori

Per gli oggetti A, B e C, è necessario che sia true:

A.CompareTo(A) è necessario restituire zero.

Se A.CompareTo(B) restituisce zero, B.CompareTo(A) è necessario restituire zero.

Se A.CompareTo(B) restituisce zero e B.CompareTo(C) restituisce zero, A.CompareTo(C) è necessario restituire zero.

Se A.CompareTo(B) restituisce un valore diverso da zero, B.CompareTo(A) è necessario restituire un valore del segno opposto.

Se A.CompareTo(B) restituisce un valore x non uguale a zero e B.CompareTo(C) restituisce un valore dello stesso segno di , è A.CompareTo(C) necessario restituire un valore y dello stesso segno xxye .

Note per i chiamanti

Utilizzare il metodo per determinare l'ordinamento CompareTo(T) delle istanze di una classe.

Si applica a

Prodotto Versioni
.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 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

Vedi anche