Ваша идея использования IEqualityComparer
в порядке, это неправильное выполнение.Примечательно, что ваш GetHashCode
метод.
public int GetHashCode(Employee obj)
{
return obj.GetHashCode();
}
IEqualityComparer
определяет и Equals
, и GetHashCode
, потому что оба они важны. Не игнорируйте GetHashCode
при реализации этого интерфейса!Это играет ключевую роль в сравнениях на равенство.Нет, это не показатель того, что два элемента равны, но это показатель того, что два элемента не являются .Два равных элемента должны возвращать один и тот же хэш-код.Если они этого не делают, их нельзя считать равными.Если они это сделают, то они могут быть равными, а функции равенства только тогда продолжит изучение Equals
.
С вашей реализацией, делегирующей GetHashCode
метод фактического объекта employee, вы полагаетесь на реализацию, которую использует класс Employee. Только если эта реализация переопределена, это будет полезно для вас, а только если использует ваши ключевые поля. А если это , то весьма вероятно, что вам не нужно было сначала определять собственный внешний компаратор!
Создайте метод GetHashCode
, который учитывает ключевые поляи вы будете установлены.
public int GetHashCode(Employee obj)
{
// null handling omitted for brevity, but you will want to
// handle null values appropriately
return obj.FirstName.GetHashCode() * 117
+ obj.LastName.GetHashCode();
}
Как только у вас будет этот метод, используйте в своем вызове компаратор для Except
.
var comparer = new EmployeeEqualityComparer();
var results = allFulltimeEmployees.Except(allParttimeEmployees, comparer);