Прочитать на английском

Поделиться через


IEqualityComparer<T> Интерфейс

Определение

Определяет методы, поддерживающие сравнение объектов на предмет равенства.

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

Параметры типа

T

Тип объектов для сравнения.

Это контравариантный параметр типа. Это означает, что вы можете использовать любой из указанных типов или любой тип, являющийся менее производным. Дополнительные сведения о ковариантности и контрвариантности см. в статье Ковариантность и контрвариантность в универсальных шаблонах.
Производный

Примеры

В следующем примере пользовательские Box объекты добавляются в коллекцию словарей. Объекты Box считаются равными, если их размеры совпадают.

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.

Комментарии

Этот интерфейс позволяет реализовать настраиваемое сравнение на равенство для коллекций. То есть можно создать собственное определение равенства для типа Tи указать, что это определение будет использоваться с типом коллекции, принимающей универсальный IEqualityComparer<T> интерфейс. В платформа .NET Framework конструкторы универсального Dictionary<TKey,TValue> типа коллекции принимают этот интерфейс.

Реализация этого интерфейса по умолчанию предоставляется свойством Default универсального EqualityComparer<T> класса. Класс StringComparer реализует IEqualityComparer<T> тип String.

Этот интерфейс поддерживает только сравнения на равенство. Настройка сравнений для сортировки и упорядочения обеспечивается универсальным интерфейсом IComparer<T> .

Рекомендуется наследовать от EqualityComparer<T> класса вместо реализации IEqualityComparer<T> интерфейса , так как EqualityComparer<T> класс проверяет равенство с помощью IEquatable<T>.Equals метода , а не Object.Equals метода . Это согласуется с методами ContainsDictionary<TKey,TValue> , IndexOf, LastIndexOfи Remove класса и других универсальных коллекций.

Методы

Equals(T, T)

Определяет, равны ли два указанных объекта.

GetHashCode(T)

Возвращает хэш-код указанного объекта.

Применяется к

Продукт Версии
.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

См. также раздел