Leer en inglés

Compartir a través de


Comparer<T> Clase

Definición

Proporciona una clase base para las implementaciones de la interfaz genérica IComparer<T>.

public abstract class Comparer<T> : System.Collections.Generic.IComparer<T>, System.Collections.IComparer
[System.Serializable]
public abstract class Comparer<T> : System.Collections.Generic.IComparer<T>, System.Collections.IComparer

Parámetros de tipo

T

Tipo de objetos que se van a comparar.

Herencia
Comparer<T>
Atributos
Implementaciones

Ejemplos

En el ejemplo siguiente se deriva una clase , BoxLengthFirstde la Comparer<T> clase . Este comparador compara dos objetos de tipo Box. Los ordena primero por longitud, luego por alto y, a continuación, por ancho. La Box clase implementa la IComparable<T> interfaz para controlar la comparación predeterminada entre dos Box objetos. Esta implementación predeterminada ordena primero por alto, después por longitud y después por ancho. En el ejemplo se muestran las diferencias entre las dos comparaciones ordenando primero una lista de Box objetos mediante el BoxLengthFirst comparador y, a continuación, mediante el comparador predeterminado.

using System;
using System.Collections;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<Box> Boxes = new List<Box>();
        Boxes.Add(new Box(4, 20, 14));
        Boxes.Add(new Box(12, 12, 12));
        Boxes.Add(new Box(8, 20, 10));
        Boxes.Add(new Box(6, 10, 2));
        Boxes.Add(new Box(2, 8, 4));
        Boxes.Add(new Box(2, 6, 8));
        Boxes.Add(new Box(4, 12, 20));
        Boxes.Add(new Box(18, 10, 4));
        Boxes.Add(new Box(24, 4, 18));
        Boxes.Add(new Box(10, 4, 16));
        Boxes.Add(new Box(10, 2, 10));
        Boxes.Add(new Box(6, 18, 2));
        Boxes.Add(new Box(8, 12, 4));
        Boxes.Add(new Box(12, 10, 8));
        Boxes.Add(new Box(14, 6, 6));
        Boxes.Add(new Box(16, 6, 16));
        Boxes.Add(new Box(2, 8, 12));
        Boxes.Add(new Box(4, 24, 8));
        Boxes.Add(new Box(8, 6, 20));
        Boxes.Add(new Box(18, 18, 12));

        // Sort by an Comparer<T> implementation that sorts
        // first by the length.
        Boxes.Sort(new BoxLengthFirst());

        Console.WriteLine("H - L - W");
        Console.WriteLine("==========");
        foreach (Box bx in Boxes)
        {
            Console.WriteLine("{0}\t{1}\t{2}",
                bx.Height.ToString(), bx.Length.ToString(),
                bx.Width.ToString());
        }

        Console.WriteLine();
        Console.WriteLine("H - L - W");
        Console.WriteLine("==========");

        // Get the default comparer that
        // sorts first by the height.
        Comparer<Box> defComp = Comparer<Box>.Default;

        // Calling Boxes.Sort() with no parameter
        // is the same as calling Boxs.Sort(defComp)
        // because they are both using the default comparer.
        Boxes.Sort();

        foreach (Box bx in Boxes)
        {
            Console.WriteLine("{0}\t{1}\t{2}",
                bx.Height.ToString(), bx.Length.ToString(),
                bx.Width.ToString());
        }


        // This explicit interface implementation
        // compares first by the length.
        // Returns -1 because the length of BoxA
        // is less than the length of BoxB.
        BoxLengthFirst LengthFirst = new BoxLengthFirst();

        Comparer<Box> bc = (Comparer<Box>) LengthFirst;

        Box BoxA = new Box(2, 6, 8);
        Box BoxB = new Box(10, 12, 14);
        int x = LengthFirst.Compare(BoxA, BoxB);
        Console.WriteLine();
        Console.WriteLine(x.ToString());
    }
}

public class BoxLengthFirst : Comparer<Box>
{
    // Compares by Length, Height, and Width.
    public override int Compare(Box x, Box y)
    {
        if (x.Length.CompareTo(y.Length) != 0)
        {
            return x.Length.CompareTo(y.Length);
        }
        else if (x.Height.CompareTo(y.Height) != 0)
        {
            return x.Height.CompareTo(y.Height);
        }
        else if (x.Width.CompareTo(y.Width) != 0)
        {
            return x.Width.CompareTo(y.Width);
        }
        else
        {
            return 0;
        }
    }
}

// This class is not demonstrated in the Main method
// and is provided only to show how to implement
// the interface. It is recommended to derive
// from Comparer<T> instead of implementing IComparer<T>.
public class BoxComp : IComparer<Box>
{
    // Compares by Height, Length, and Width.
    public int Compare(Box x, Box y)
    {
        if (x.Height.CompareTo(y.Height) != 0)
        {
            return x.Height.CompareTo(y.Height);
        }
        else if (x.Length.CompareTo(y.Length) != 0)
        {
            return x.Length.CompareTo(y.Length);
        }
        else if (x.Width.CompareTo(y.Width) != 0)
        {
            return x.Width.CompareTo(y.Width);
        }
        else
        {
            return 0;
        }
    }
}

public class Box : IComparable<Box>
{

    public Box(int h, int l, int w)
    {
        this.Height = h;
        this.Length = l;
        this.Width = w;
    }
    public int Height { get; private set; }
    public int Length { get; private set; }
    public int Width { get; private set; }

    public int CompareTo(Box other)
    {
        // Compares Height, Length, and Width.
        if (this.Height.CompareTo(other.Height) != 0)
        {
            return this.Height.CompareTo(other.Height);
        }
        else if (this.Length.CompareTo(other.Length) != 0)
        {
            return this.Length.CompareTo(other.Length);
        }
        else if (this.Width.CompareTo(other.Width) != 0)
        {
            return this.Width.CompareTo(other.Width);
        }
        else
        {
            return 0;
        }
    }
}

Comentarios

Derive de esta clase para proporcionar una implementación personalizada de la IComparer<T> interfaz para su uso con clases de colección como las SortedList<TKey,TValue> clases genéricas y SortedDictionary<TKey,TValue> .

La diferencia entre derivar de la Comparer<T> clase e implementar la System.IComparable interfaz es la siguiente:

  • Para especificar cómo se deben comparar dos objetos de forma predeterminada, implemente la interfaz en la System.IComparable clase . Esto garantiza que las operaciones de ordenación usarán el código de comparación predeterminado que proporcionó.

  • Para definir un comparador que se va a usar en lugar del comparador predeterminado, derive de la Comparer<T> clase . A continuación, puede usar este comparador en operaciones de ordenación que toman un comparador como parámetro.

El objeto devuelto por la Default propiedad usa la System.IComparable<T> interfaz genérica (IComparable<T> en C#, IComparable(Of T) en Visual Basic) para comparar dos objetos. Si el tipo T no implementa la System.IComparable<T> interfaz genérica, la Default propiedad devuelve un Comparer<T> que usa la System.IComparable interfaz .

Notas a los implementadores

Compare(T, T) y pueden comportarse de forma diferente en términos de distinción cultural y distinción entre mayúsculas y Equals(T, T) minúsculas.

Para las comparaciones de cadenas, se recomienda la StringComparer clase en Comparer<String>. Las propiedades de la StringComparer clase devuelven instancias predefinidas que realizan comparaciones de cadenas con diferentes combinaciones de distinción cultural y distinción entre mayúsculas y minúsculas. La distinción entre mayúsculas y minúsculas y la distinción cultural son coherentes entre los miembros de la misma StringComparer instancia.

Para obtener más información sobre las comparaciones específicas de la referencia cultural, consulte el espacio de nombres y globalización System.Globalizationy la localización.

Constructores

Comparer<T>()

Inicializa una nueva instancia de la clase Comparer<T>.

Propiedades

Default

Devuelve un comparador de criterios de ordenación predeterminado para el tipo especificado por el argumento genérico.

Métodos

Compare(T, T)

Cuando se reemplaza en una clase derivada, realiza una comparación de dos objetos del mismo tipo y devuelve un valor que indica si uno es menor, igual o mayor que el otro.

Create(Comparison<T>)

Crea un comparador mediante la comparación especificada.

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Implementaciones de interfaz explícitas

IComparer.Compare(Object, Object)

Compara dos objetos y devuelve un valor que indica si uno de ellos es menor, igual o mayor que el otro.

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
.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.6, 2.0, 2.1
UWP 10.0

Consulte también