Сравнение объектов в .net
-
12-10-2019 - |
Вопрос
Это отличается от точки зрения CLR для реализации IEqualityComparer
против переоценки ==
оператор для объекта, которую вы бы использовали в IEqualityComparer<T>
? И если так, когда бы вы использовали одно против другого?
Редактировать
Хорошо, имеет смысл, что IeQulityComperer, используемый в реализации хэштата - он выскользнул из моего ума, когда я публиковал вопрос. Так что насчет расширений LINQ Ienumerable. Означает ли это, что .NET создает хэштебу, при выполнении таких методов расширения?
Решение
IEqualityComparer
не является equal
, равна для объекта (метод экземпляра), но EqualityComparer предназначен для украшения, например, в LINQ, который вы хотите сделать конкретно:
personList.OrderBy(p=>p.ID).Distinct(new MyEqualityComparer())
а также
class MyEqualityComparer: IEqualityComparer<Person>
{
public bool Equals(Person p1, Person p2)
{
if (p1.Age == p2.Age)
return true;
return false;
}
public int GetHashCode(Person p)
{
return p.Id.GetHashCode();
}
}
но равна для человека:
public class Person
{
public int ID{get;set;}
public int Age{get;set;}
public override bool Equals(object o)
{
//do stuff
}
}
Вы можете сделать любое количество украшений от iEqualityComparer, но вы не можете сделать это по методу экземпляра (вы можете написать PersonList.distinct (новый другой COMPARERER), ...)
Другие советы
IequalityComparer используется Хеш-таблица, NamevalueCollection а также Заказан классы для поддержки пользовательского определения «равенства» для ваших типов. Вот почему он обеспечивает Gethashcode (), что не имеет ничего общего с равенством как таковой.
Если вы не предоставите IEqualityComparer
, упомянутые выше классы не по умолчанию Object.equals (), который реализует справочное равенство. Анкет Перегружен operator ==
не будет вызван в этом контексте.
РЕДАКТИРОВАТЬ: Некоторые методы расширения LINQ действительно принимают IEqualityComparer
в качестве аргумента, но принцип остается прежним: если этот аргумент не указан, метод в конечном итоге будет сравнивать ссылки, а не значения, и operator ==
не будет вызван.
IEqualityComparer
используется, например, для сравнения в Dictionary<TK,TV>
.
Он полностью отличается от переоценки ==
оператор, потому что на самом деле Dictionary
(и вообще любое использование IEqualityComparer
) не звонит ==
оператор.
Больше всего вы можете сравнить «реализация IEqualityComparer
"VS" GetHashCode
а также Equals
Методы », потому что действительно это два способа получить одно и то же (и я бы сказал, что они равны мне).