Leer en inglés

Compartir a través de


IComparable<T> Interfaz

Definición

Define un método de comparación generalizado, implementado por un tipo de valor o clase con el fin de crear un método de comparación específico del tipo para ordenar instancias.

C#
public interface IComparable<in T>
C#
public interface IComparable<T>

Parámetros de tipo

T

Tipo de objeto que se va a comparar.

Este parámetro de tipo es contravariante, es decir, puede usar el tipo que haya especificado o cualquier tipo menos derivado. Si desea obtener más información sobre la covarianza y la contravarianza, consulte Covarianza y contravarianza en genéricos.
Derivado

Ejemplos

En el ejemplo siguiente se muestra la implementación de IComparable<T> para un objeto simple Temperature . En el ejemplo se crea una SortedList<TKey,TValue> colección de cadenas con Temperature claves de objeto y se agregan varios pares de temperaturas y cadenas a la lista fuera de secuencia. En la llamada al Add método , la SortedList<TKey,TValue> colección usa la IComparable<T> implementación para ordenar las entradas de lista, que a continuación se muestran en orden de aumento de 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.
*/

Comentarios

Esta interfaz se implementa mediante tipos cuyos valores se pueden ordenar o ordenar y proporciona un método de comparación fuertemente tipado para ordenar miembros de un objeto de colección genérico. Por ejemplo, un número puede ser mayor que un segundo y una cadena puede aparecer en orden alfabético delante de otra. Requiere que los tipos de implementación definan un único método, CompareTo(T), que indica si la posición de la instancia actual en el criterio de ordenación es anterior, posterior o igual que un segundo objeto del mismo tipo. Normalmente, no se llama al método directamente desde el código de desarrollador. En su lugar, se llama automáticamente mediante métodos como List<T>.Sort() y Add.

Normalmente, los tipos que proporcionan una IComparable<T> implementación también implementan la IEquatable<T> interfaz . La IEquatable<T> interfaz define el Equals método , que determina la igualdad de instancias del tipo de implementación.

La implementación del CompareTo(T) método debe devolver un Int32 que tenga uno de tres valores, como se muestra en la tabla siguiente.

Valor Significado
Menor que cero Este objeto precede al objeto especificado por el CompareTo método en el criterio de ordenación.
Cero Esta instancia actual se produce en la misma posición en el criterio de ordenación que el objeto especificado por el argumento del CompareTo método.
Mayor que cero Esta instancia actual sigue el objeto especificado por el argumento de CompareTo método en el criterio de ordenación.

Todos los tipos numéricos (como Int32 y Double) implementan IComparable<T>, como String, Chary DateTime. Los tipos personalizados también deben proporcionar su propia implementación de IComparable<T> para permitir que las instancias de objeto se ordenen o ordenen.

Notas a los implementadores

Reemplace el parámetro type de la IComparable<T> interfaz por el tipo que implementa esta interfaz.

Si implementa IComparable<T>, debe sobrecargar los op_GreaterThanoperadores , op_GreaterThanOrEqual, op_LessThany op_LessThanOrEqual para devolver valores coherentes con CompareTo(T). Además, también debe implementar IEquatable<T>. Consulte el IEquatable<T> artículo para obtener información completa.

Métodos

CompareTo(T)

Compara la instancia actual con otro objeto del mismo tipo y devuelve un entero que indica si la posición de la instancia actual es anterior, posterior o igual que la del otro objeto en el criterio de ordenación.

Se aplica a

Producto Versiones
.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

Consulte también