Lire en anglais

Partager via


IEqualityComparer<T> Interface

Définition

Définit des méthodes pour prendre en charge la comparaison d'objets.

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

Paramètres de type

T

Type des objets à comparer.

Ce paramètre de type est contravariant. Cela signifie que vous pouvez utiliser le type spécifié ou tout type moins dérivé. Pour plus d’informations sur la covariance et la contravariance, consultez Covariance et contravariance dans les génériques.
Dérivé

Exemples

L’exemple suivant ajoute des objets personnalisés Box à une collection de dictionnaires. Les Box objets sont considérés comme égaux si leurs dimensions sont les mêmes.

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.

Remarques

Cette interface permet l’implémentation d’une comparaison d’égalité personnalisée pour les collections. Autrement dit, vous pouvez créer votre propre définition d’égalité pour le type Tet spécifier que cette définition doit être utilisée avec un type de collection qui accepte l’interface IEqualityComparer<T> générique. Dans le .NET Framework, les constructeurs du Dictionary<TKey,TValue> type de collection générique acceptent cette interface.

Une implémentation par défaut de cette interface est fournie par la Default propriété de la EqualityComparer<T> classe générique. La StringComparer classe implémente IEqualityComparer<T> de type String.

Cette interface prend uniquement en charge les comparaisons d’égalité. La personnalisation des comparaisons pour le tri et l’ordre est fournie par l’interface IComparer<T> générique.

Nous vous recommandons de dériver de la EqualityComparer<T> classe au lieu d’implémenter l’interface IEqualityComparer<T> , car la EqualityComparer<T> classe teste l’égalité à l’aide de la IEquatable<T>.Equals méthode au lieu de la Object.Equals méthode. Cela est cohérent avec les Containsméthodes , IndexOf, LastIndexOfet Remove de la Dictionary<TKey,TValue> classe et d’autres collections génériques.

Méthodes

Equals(T, T)

Détermine si les objets spécifiés sont égaux.

GetHashCode(T)

Retourne un code de hachage pour l'objet spécifié.

S’applique à

Produit Versions
.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

Voir aussi