C# EqualityComparer
Что такое EqualityComparer, почему у него есть свойство Default? Зачем это? Я ведь могу просто использовать обычный метод Equals.
Ответы (1 шт):
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.
А т.к. сам исходный класс от компаратора не зависит - вам ничего не мешает завести любое колличество разнообразных компараторов и в зависимости от ситуации использовать нужный.
И ещё много чего не сказанного, т.к. возможностей куда больше, ибо это просто класс, оформленный по определённым правилам, делать с ним вы можете что угодно.