Leggi in inglese

Condividi tramite


IEqualityComparer<T> Interfaccia

Definizione

Definisce i metodi per supportare il confronto di oggetti allo scopo di verificarne l'uguaglianza.

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

Parametri di tipo

T

Tipo di oggetti da confrontare.

Questo parametro di tipo è controvariante, ovvero puoi usare il tipo specificato o qualsiasi tipo meno derivato. Per altre informazioni sulla covarianza e la controvarianza, vedi Covarianza e controvarianza nei generics.
Derivato

Esempio

Nell'esempio seguente vengono aggiunti oggetti personalizzati Box a un insieme dizionario. Gli Box oggetti vengono considerati uguali se le dimensioni sono uguali.

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.

Commenti

Questa interfaccia consente l'implementazione del confronto di uguaglianza personalizzato per le raccolte. Vale a dire, è possibile creare una definizione personalizzata di uguaglianza per il tipo Te specificare che questa definizione viene usata con un tipo di raccolta che accetta l'interfaccia IEqualityComparer<T> generica. In .NET Framework i costruttori del Dictionary<TKey,TValue> tipo di raccolta generico accettano questa interfaccia.

Un'implementazione predefinita di questa interfaccia viene fornita dalla Default proprietà della EqualityComparer<T> classe generica. La StringComparer classe implementa IEqualityComparer<T> di tipo String.

Questa interfaccia supporta solo confronti di uguaglianza. La personalizzazione dei confronti per l'ordinamento e l'ordinamento vengono fornite dall'interfaccia IComparer<T> generica.

È consigliabile derivare dalla EqualityComparer<T> classe anziché implementare l'interfaccia, perché la EqualityComparer<T> classe verifica l'uguaglianza IEqualityComparer<T> usando il metodo anziché il IEquatable<T>.EqualsObject.Equals metodo. Ciò è coerente con i Containsmetodi , , IndexOfLastIndexOfe Remove della Dictionary<TKey,TValue> classe e altre raccolte generiche.

Metodi

Equals(T, T)

Determina se gli oggetti specificati sono uguali.

GetHashCode(T)

Viene restituito un codice hash per l'oggetto specificato.

Si applica a

Prodotto Versioni
.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

Vedi anche