C# EqualityComparer

Что такое EqualityComparer, почему у него есть свойство Default? Зачем это? Я ведь могу просто использовать обычный метод Equals.


Ответы (1 шт):

Автор решения: Blackmeser

EqualityComparer нужен для сравнения классов на основе заданного алгоритма.
Default - автоматически сгенерированный компаратор, для вашего <T>. (тут могу ошибаться, не пользовался)

Пример:

//пример класса Person с свойством возраста Age
class Person
{ 
    public string Name { get; set; }
    public int Age { get; set; }
}
//создадим компаратор, который сравнивает возраст Age у класса Person
class PersonAgeComparer : EqualityComparer<Person>
{
    public override bool Equals(Person b1, Person b2)
    {
        if (b1 == null && b2 == null)
            return true;
        else if (b1 == null || b2 == null)
            return false;
        return b1.Age == b2.Age;
    }
    public override int GetHashCode(Person bx)
    {
        int hCode = bx.Age;
        return hCode.GetHashCode();
    }
}
//создадим для примера 3 экземпляра класса, у двух возраст Age совпадает
Person p1 = new Person() { Name = "Jack", Age = 20 };
Person p2 = new Person() { Name = "Ben", Age = 25 };
Person p3 = new Person() { Name = "Steve", Age = 25 };
List<PersonHumans = new List<Person>() { p1, p2, p3 };
//сгруппируем по возрасту, с использованием копраратора, который создали ранее
var groups = Humans.GroupBy(g => g, new PersonAgeComparer());
foreach(var g in groups)
{
    WriteLine("Age: "+ g.Key.Age);
    g.ToList<Person>().ForEach(a => WriteLine(a.Name));
    WriteLine("");
}

Вывод:

Age: 20
Jack

Age: 25
Ben
Steve

Пример и компаратор простые, просто как пример использования.
Суть в том, что внутри компаратора можно рисовать любые критерии сравнения, на основе любых полей, добавляя любые алгоритмы в метод Equals.
А т.к. сам исходный класс от компаратора не зависит - вам ничего не мешает завести любое колличество разнообразных компараторов и в зависимости от ситуации использовать нужный.
И ещё много чего не сказанного, т.к. возможностей куда больше, ибо это просто класс, оформленный по определённым правилам, делать с ним вы можете что угодно.

→ Ссылка