Leer en inglés

Compartir a través de


EqualityComparer<T> Clase

Definición

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

public abstract class EqualityComparer<T> : System.Collections.Generic.IEqualityComparer<T>, System.Collections.IEqualityComparer
[System.Serializable]
public abstract class EqualityComparer<T> : System.Collections.Generic.IEqualityComparer<T>, System.Collections.IEqualityComparer

Parámetros de tipo

T

Tipo de objetos que se van a comparar.

Herencia
EqualityComparer<T>
Atributos
Implementaciones

Ejemplos

En el ejemplo siguiente se crea una colección de diccionarios de objetos de tipo Box con un comparador de igualdad. Dos cuadros se consideran iguales si sus dimensiones son iguales. A continuación, agrega los cuadros a la colección.

El diccionario se vuelve a crear con un comparador de igualdad que define la igualdad de una manera diferente: dos cuadros se consideran iguales si sus volúmenes son iguales.

using System;
using System.Collections.Generic;

class Program
{
    static Dictionary<Box, String> boxes;

    static void Main()
    {
        BoxSameDimensions boxDim = new BoxSameDimensions();
        boxes = new Dictionary<Box, string>(boxDim);

        Console.WriteLine("Boxes equality by dimensions:");
        Box redBox = new Box(8, 4, 8);
        Box greenBox = new Box(8, 6, 8);
        Box blueBox = new Box(8, 4, 8);
        Box yellowBox = new Box(8, 8, 8);
        AddBox(redBox, "red");
        AddBox(greenBox, "green");
        AddBox(blueBox, "blue");
        AddBox(yellowBox, "yellow");

        Console.WriteLine();
        Console.WriteLine("Boxes equality by volume:");

        BoxSameVolume boxVolume = new BoxSameVolume();
        boxes = new Dictionary<Box, string>(boxVolume);
        Box pinkBox = new Box(8, 4, 8);
        Box orangeBox = new Box(8, 6, 8);
        Box purpleBox = new Box(4, 8, 8);
        Box brownBox = new Box(8, 8, 4);
        AddBox(pinkBox, "pink");
        AddBox(orangeBox, "orange");
        AddBox(purpleBox, "purple");
        AddBox(brownBox, "brown");
    }

    public static void AddBox(Box bx, string name)
    {
        try
        {
            boxes.Add(bx, name);
            Console.WriteLine("Added {0}, Count = {1}, HashCode = {2}",
                name, boxes.Count.ToString(), bx.GetHashCode());
        }
        catch (ArgumentException)
        {
            Console.WriteLine("A box equal to {0} is already in the collection.", name);
        }
    }
}

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

class BoxSameDimensions : EqualityComparer<Box>
{
    public override bool Equals(Box b1, Box b2)
    {
        if (b1 == null && b2 == null)
            return true;
        else if (b1 == null || b2 == null)
            return false;

        return (b1.Height == b2.Height &&
                b1.Length == b2.Length &&
                b1.Width == b2.Width);
    }

    public override int GetHashCode(Box bx)
    {
        int hCode = bx.Height ^ bx.Length ^ bx.Width;
        return hCode.GetHashCode();
    }
}

class BoxSameVolume : EqualityComparer<Box>
{
    public override bool Equals(Box b1, Box b2)
    {
        if (b1 == null && b2 == null)
            return true;
        else if (b1 == null || b2 == null)
            return false;

        return (b1.Height * b1.Width * b1.Length ==
                b2.Height * b2.Width * b2.Length);
    }

    public override int GetHashCode(Box bx)
    {
        int hCode = bx.Height * bx.Length * bx.Width;
        return hCode.GetHashCode();
    }
}
/* This example produces an output similar to the following:
 *
      Boxes equality by dimensions:
      Added red, Count = 1, HashCode = 46104728
      Added green, Count = 2, HashCode = 12289376
      A box equal to blue is already in the collection.
      Added yellow, Count = 3, HashCode = 43495525

      Boxes equality by volume:
      Added pink, Count = 1, HashCode = 55915408
      Added orange, Count = 2, HashCode = 33476626
      A box equal to purple is already in the collection.
      A box equal to brown is already in the collection.
 *
*/

Comentarios

Derive de esta clase para proporcionar una implementación personalizada de la IEqualityComparer<T> interfaz genérica para su uso con clases de colección como la Dictionary<TKey,TValue> clase genérica o con métodos como List<T>.Sort.

La Default propiedad comprueba si el tipo T implementa la System.IEquatable<T> interfaz genérica y, si es así, devuelve un EqualityComparer<T> objeto que invoca la implementación del IEquatable<T>.Equals método . De lo contrario, devuelve un EqualityComparer<T>, tal y como lo proporciona T.

En .NET 8 y versiones posteriores, se recomienda usar el EqualityComparer<T>.Create(Func<T,T,Boolean>, Func<T,Int32>) método para crear instancias de este tipo.

Constructores

EqualityComparer<T>()

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

Propiedades

Default

Devuelve un comparador de igualdad predeterminado para el tipo especificado por el argumento genérico.

Métodos

Create(Func<T,T,Boolean>, Func<T,Int32>)

Crea un EqualityComparer<T> mediante el uso de los delegados especificados como la implementación de los métodos y GetHashCode(T) del Equals(T, T) comparador.

Equals(Object)

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

(Heredado de Object)
Equals(T, T)

Cuando se reemplaza en una clase derivada, determina si dos objetos de tipo T son iguales.

GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetHashCode(T)

Cuando se reemplaza en una clase derivada sirve como función hash para los objetos especificados para los algoritmos hash y las estructuras de datos, como las tablas hash.

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

IEqualityComparer.Equals(Object, Object)

Determina si los objetos especificados son iguales.

IEqualityComparer.GetHashCode(Object)

Devuelve un código hash para el objeto especificado.

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