Сравнение объектов в .net

Разве это не отличается от точки зрения CLR для реализации IEqualityComparer против переопределения оператора == для свойства, которое вы бы использовали в IEqualityComparer ? И если так, когда вы будете использовать один против другого?

редактировать

Хорошо, имеет смысл, что IEqaulityComparer используется реализацией Hashtable – он соскользнул с моего ума, когда я отправлял вопрос. Так что о расширениях Linq из IEnumerable. Означает ли это, что .net создает Hashtable при выполнении таких методов расширения?

IEqualityComparer не equal , равно для объекта (метод экземпляра), но EqualityComparer предназначен для украшения, например, в linq, который вы хотите сделать конкретным:

personList.OrderBy(p=>p.ID).Distinct(new MyEqualityComparer())

а также

  class MyEqualityComparer: IEqualityComparer { 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 (new AnotherComparer), …)

IEqualityComparer используется classами Hashtable , NameValueCollection и OrderedDictionary для поддержки пользовательского определения «равенства» для ваших типов. Именно поэтому он предоставляет GetHashCode () , который не имеет особого отношения к равенству как таковому .

Если вы не предоставляете IEqualityComparer , classы, упомянутые выше, будут по умолчанию Object.Equals () , которые реализуют ссылочное равенство . Перегруженный operator == не будет вызываться в этом контексте.

EDIT: Некоторые методы расширения LINQ действительно принимают IEqualityComparer в качестве аргумента, но принцип остается тем же: если этот аргумент не указан, метод завершит сравнение ссылок, а не значений, а operator == не будет вызываться.

IEqualityComparer используется, например, для сравнения в Dictionary .

Он полностью отличается от переопределяющего == оператора, потому что фактически Dictionary (и вообще то, что использует IEqualityComparer ) не вызывает никакого вызова == оператора.

В IEqualityComparer вы можете сравнить «реализацию IEqualityComparer » и «переопределение методов GetHashCode и Equals », потому что на самом деле это два способа получить одно и то же (и я бы сказал, что они равны мне).