Ler em inglês

Partilhar via


IEqualityComparer<T> Interface

Definição

Define métodos para dar suporte à comparação de objetos para igualdade.

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

Parâmetros de tipo

T

O tipo de objetos a serem comparados.

Este parâmetro de tipo é contravariante. Isso significa que é possível usar o tipo especificado ou qualquer tipo menos derivado. Para obter mais informações sobre covariância e contravariância, consulte Covariância e contravariância em genéricos.
Derivado

Exemplos

O exemplo a seguir adiciona objetos personalizados Box a uma coleção de dicionários. Os Box objetos são considerados iguais se suas dimensões forem as mesmas.

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

static class Example
{
    static void Main()
    {
        BoxEqualityComparer comparer = new();

        Dictionary<Box, string> boxes = new(comparer);

        AddBox(new Box(4, 3, 4), "red");
        AddBox(new Box(4, 3, 4), "blue");
        AddBox(new Box(3, 4, 3), "green");

        Console.WriteLine($"The dictionary contains {boxes.Count} Box objects.");

        void AddBox(Box box, string name)
        {
            try
            {
                boxes.Add(box, name);
            }
            catch (ArgumentException e)
            {
                Console.WriteLine($"Unable to add {box}: {e.Message}");
            }
        }
    }
}

class Box
{
    public int Height { get; }
    public int Length { get; }
    public int Width { get; }

    public Box(int height, int length, int width)
    {
        Height = height;
        Length = length;
        Width = width;
    }

    public override string ToString() => $"({Height}, {Length}, {Width})";
}

class BoxEqualityComparer : IEqualityComparer<Box>
{
    public bool Equals(Box? b1, Box? b2)
    {
        if (ReferenceEquals(b1, b2))
            return true;

        if (b2 is null || b1 is null)
            return false;

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

    public int GetHashCode(Box box) => box.Height ^ box.Length ^ box.Width;
}

// The example displays the following output:
//    Unable to add (4, 3, 4): An item with the same key has already been added.
//    The dictionary contains 2 Box objects.

Comentários

Essa interface permite a implementação da comparação de igualdade personalizada para coleções. Ou seja, você pode criar sua própria definição de igualdade para o tipo Te especificar que essa definição seja usada com um tipo de coleção que aceite a IEqualityComparer<T> interface genérica. No .NET Framework, os construtores do Dictionary<TKey,TValue> tipo de coleção genérica aceitam essa interface.

Uma implementação padrão dessa interface é fornecida pela Default propriedade da EqualityComparer<T> classe genérica. A StringComparer classe implementa IEqualityComparer<T> do tipo String.

Essa interface dá suporte apenas a comparações de igualdade. A personalização de comparações para classificação e ordenação é fornecida pela IComparer<T> interface genérica.

Recomendamos que você derive da EqualityComparer<T> classe em vez de implementar a IEqualityComparer<T> interface, pois a EqualityComparer<T> classe testa a igualdade usando o IEquatable<T>.Equals método em vez do Object.Equals método . Isso é consistente com os Containsmétodos , IndexOf, LastIndexOfe Remove da Dictionary<TKey,TValue> classe e de outras coleções genéricas.

Métodos

Equals(T, T)

Determina se os objetos especificados são iguais.

GetHashCode(T)

Retorna um código hash para o objeto especificado.

Aplica-se a

Produto Versões
.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.5, 1.6, 2.0, 2.1
UWP 10.0

Confira também