Вопрос

Это отличается от точки зрения 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 Методы », потому что действительно это два способа получить одно и то же (и я бы сказал, что они равны мне).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top