Comparer<T> Comparer<T> Comparer<T> Comparer<T> Class

Definición

Proporciona una clase base para las implementaciones de la interfaz genérica IComparer<T>.Provides a base class for implementations of the IComparer<T> generic interface.

generic <typename T>
public ref class Comparer abstract : System::Collections::Generic::IComparer<T>, System::Collections::IComparer
[System.Serializable]
public abstract class Comparer<T> : System.Collections.Generic.IComparer<T>, System.Collections.IComparer
type Comparer<'T> = class
    interface IComparer
    interface IComparer<'T>
Public MustInherit Class Comparer(Of T)
Implements IComparer, IComparer(Of T)

Parámetros de tipo

T

Tipo de objetos que se van a comparar.The type of objects to compare.

Herencia
Comparer<T>Comparer<T>Comparer<T>Comparer<T>
Atributos
Implementaciones

Ejemplos

En el ejemplo siguiente se deriva una clase, BoxLengthFirst, desde el Comparer<T> clase.The following example derives a class, BoxLengthFirst, from the Comparer<T> class. Este comparador que compara dos objetos de tipo Box.This comparer compares two objects of type Box. Ordena primero por la longitud, alto y, a continuación, en el ancho.It sorts them first by length, then by height, and then by width. El Box la clase implementa la IComparable<T> interfaz para controlar la comparación predeterminada entre dos Box objetos.The Box class implements the IComparable<T> interface to control the default comparison between two Box objects. Esta implementación predeterminada ordena primero por alto, longitud y, a continuación, en el ancho.This default implementation sorts first by height, then by length, and then by width. En el ejemplo se muestra las diferencias entre las dos comparaciones al ordenar una lista de Box objetos primero mediante el BoxLengthFirst comparador y a continuación, use el comparador predeterminado.The example shows the differences between the two comparisons by sorting a list of Box objects first by using the BoxLengthFirst comparer and then by using the default comparer.

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;
        }
    }

}

Imports System.Collections.Generic

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim Boxes As New List(Of 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("==========")
		For Each bx As Box In Boxes
            Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2}", _
                              bx.Height.ToString(), bx.Length.ToString(), _
                              bx.Width.ToString())
		Next bx

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

		' Get the default comparer that 
		' sorts first by the height.
		Dim defComp As Comparer(Of Box) = Comparer(Of 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()

		For Each bx As Box In Boxes
            Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2}", _
                              bx.Height.ToString(), _
                              bx.Length.ToString(), _
                              bx.Width.ToString())
		Next bx


		' This explicit interface implementation
		' compares first by the length.
		' Returns -1 because the length of BoxA
		' is less than the length of BoxB.
		Dim LengthFirst As New BoxLengthFirst()

		Dim bc As Comparer(Of Box) = CType(LengthFirst, Comparer(Of Box))

		Dim BoxA As New Box(2, 6, 8)
		Dim BoxB As New Box(10, 12, 14)
		Dim x As Integer = LengthFirst.Compare(BoxA, BoxB)
		Console.WriteLine()
		Console.WriteLine(x.ToString())



	End Sub

End Class

Public Class BoxLengthFirst
	Inherits Comparer(Of Box)
	' Compares by Length, Height, and Width.
	Public Overrides Function Compare(ByVal x As Box, ByVal y As Box) As Integer
		If x.Length.CompareTo(y.Length) <> 0 Then
			Return x.Length.CompareTo(y.Length)
		ElseIf x.Height.CompareTo(y.Height) <> 0 Then
			Return x.Height.CompareTo(y.Height)
		ElseIf x.Width.CompareTo(y.Width) <> 0 Then
			Return x.Width.CompareTo(y.Width)
		Else
			Return 0
		End If
	End Function

End Class

' 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
	Implements IComparer(Of Box)
	' Compares by Height, Length, and Width.
    Public Function Compare(ByVal x As Box, ByVal y As Box) As Integer Implements _
                                                IComparer(Of Box).Compare
        If x.Height.CompareTo(y.Height) <> 0 Then
            Return x.Height.CompareTo(y.Height)
        ElseIf x.Length.CompareTo(y.Length) <> 0 Then
            Return x.Length.CompareTo(y.Length)
        ElseIf x.Width.CompareTo(y.Width) <> 0 Then
            Return x.Width.CompareTo(y.Width)
        Else
            Return 0
        End If
    End Function
End Class

Public Class Box
	Implements IComparable(Of Box)

	Public Sub New(ByVal h As Integer, ByVal l As Integer, ByVal w As Integer)
		Me.Height = h
		Me.Length = l
		Me.Width = w
	End Sub
	Private privateHeight As Integer
	Public Property Height() As Integer
		Get
			Return privateHeight
		End Get
		Private Set(ByVal value As Integer)
			privateHeight = value
		End Set
	End Property
	Private privateLength As Integer
	Public Property Length() As Integer
		Get
			Return privateLength
		End Get
		Private Set(ByVal value As Integer)
			privateLength = value
		End Set
	End Property
	Private privateWidth As Integer
	Public Property Width() As Integer
		Get
			Return privateWidth
		End Get
		Private Set(ByVal value As Integer)
			privateWidth = value
		End Set
	End Property

    Public Function CompareTo(ByVal other As Box) As Integer _
                        Implements IComparable(Of Box).CompareTo
        ' Compares Height, Length, and Width.
        If Me.Height.CompareTo(other.Height) <> 0 Then
            Return Me.Height.CompareTo(other.Height)
        ElseIf Me.Length.CompareTo(other.Length) <> 0 Then
            Return Me.Length.CompareTo(other.Length)
        ElseIf Me.Width.CompareTo(other.Width) <> 0 Then
            Return Me.Width.CompareTo(other.Width)
        Else
            Return 0
        End If
    End Function

End Class

Comentarios

Derivar de esta clase para proporcionar una implementación personalizada de la IComparer<T> interfaz para su uso con las clases de colección, como el SortedList<TKey,TValue> y SortedDictionary<TKey,TValue> clases genéricas.Derive from this class to provide a custom implementation of the IComparer<T> interface for use with collection classes such as the SortedList<TKey,TValue> and SortedDictionary<TKey,TValue> generic classes.

La diferencia entre la derivación desde el Comparer<T> clase e implementar la System.IComparable interfaz es como sigue:The difference between deriving from the Comparer<T> class and implementing the System.IComparable interface is as follows:

  • Para especificar cómo deben compararse los dos objetos de forma predeterminada, implemente el System.IComparable interfaz en la clase.To specify how two objects should be compared by default, implement the System.IComparable interface in your class. Esto garantiza que las operaciones de ordenación usará el código de comparación predeterminado que proporcionó.This ensures that sort operations will use the default comparison code that you provided.

  • Para definir un comparador que se va a usar en lugar del comparador predeterminado, que se derivan de la Comparer<T> clase.To define a comparer to use instead of the default comparer, derive from the Comparer<T> class. A continuación, puede usar a este comparador en las operaciones de ordenación que toman a un comparador como un parámetro.You can then use this comparer in sort operations that take a comparer as a parameter.

El objeto devuelto por la Default propiedad usa el System.IComparable<T> interfaz genérica (IComparable<T> en C#, IComparable(Of T) en Visual Basic) para comparar dos objetos.The object returned by the Default property uses the System.IComparable<T> generic interface (IComparable<T> in C#, IComparable(Of T) in Visual Basic) to compare two objects. Si tipo T no implementa la System.IComparable<T> interfaz genérica, la Default propiedad devuelve un Comparer<T> que usa el System.IComparable interfaz.If type T does not implement the System.IComparable<T> generic interface, the Default property returns a Comparer<T> that uses the System.IComparable interface.

Notas a los desarrolladores de herederos

Compare(T, T) y System.Collections.Generic.EqualityComparer`1.Equals(`0,\`0) pueden comportarse de forma diferente en cuanto a mayúsculas y minúsculas y confidencialidad de la referencia cultural. System.Collections.Generic.Comparer`1.Compare(`0,\`0) and System.Collections.Generic.EqualityComparer`1.Equals(`0,\`0) may behave differently in terms of culture-sensitivity and case-sensitivity.

Para las comparaciones de cadenas, la StringComparer clase es preferible a comparador<cadena>.For string comparisons, the StringComparer class is recommended over Comparer<String>. Propiedades de la StringComparer clase devuelven instancias predefinidas que realizan las comparaciones de cadenas con diferentes combinaciones de mayúsculas y minúsculas y confidencialidad de la referencia cultural.Properties of the StringComparer class return predefined instances that perform string comparisons with different combinations of culture-sensitivity and case-sensitivity. Las minúsculas y la sensibilidad de la referencia cultural son coherentes entre los miembros del mismo StringComparer instancia.The case-sensitivity and culture-sensitivity are consistent among the members of the same StringComparer instance.

Para obtener más información sobre las comparaciones específicas de la referencia cultural, consulte el System.Globalization espacio de nombres y globalización y localización.For more information on culture-specific comparisons, see the System.Globalization namespace and Globalization and Localization.

Constructores

Comparer<T>() Comparer<T>() Comparer<T>() Comparer<T>()

Inicializa una nueva instancia de la clase Comparer<T>.Initializes a new instance of the Comparer<T> class.

Propiedades

Default Default Default Default

Devuelve un comparador de criterios de ordenación predeterminado para el tipo especificado por el argumento genérico.Returns a default sort order comparer for the type specified by the generic argument.

Métodos

Compare(T, T) Compare(T, T) Compare(T, T) 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.When overridden in a derived class, performs a comparison of two objects of the same type and returns a value indicating whether one object is less than, equal to, or greater than the other.

Create(Comparison<T>) Create(Comparison<T>) Create(Comparison<T>) Create(Comparison<T>)

Crea un comparador mediante la comparación especificada.Creates a comparer by using the specified comparison.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Determina si el objeto especificado es igual al objeto actual.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Sirve como la función hash predeterminada.Serves as the default hash function.

(Inherited from Object)
GetType() GetType() GetType() GetType()

Obtiene el Type de la instancia actual.Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Crea una copia superficial del Object actual.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Devuelve una cadena que representa el objeto actual.Returns a string that represents the current object.

(Inherited from Object)

Implementaciones de interfaz explícitas

IComparer.Compare(Object, Object) IComparer.Compare(Object, Object) IComparer.Compare(Object, Object) 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.Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other.

Se aplica a

Consulte también: