2013-11-15 3 views
3

У меня есть список, который я хочу фильтровать для дублирования элементов. Я искал в StackOverflow, прежде чем задавать этот вопрос и нашел два решения; используя .Distinct() и используя HashSet, однако ни один из этих методов не работал для меня. Объект, который я пытаюсь фильтровать, реализует метод .Equals, но он все еще не работает.Фильтрация дубликатов в списке

Я проверил это, создав 500 объектов, которые являются точно такими же и помещают их в список. Я ожидал, что 1 останется, но все 500 все еще там. Должен ли мой объект использовать дополнительные методы для этого?

Спасибо.

+2

Можете ли вы поделиться какой-то код, показывающий ваш метод Equals и как вы используете Distinct –

+1

Что касается ответа Тима Шмельтера, можете ли вы сказать нам, что объект также переопределяет GetHashCode? Если это не так, у вас есть доступ к исходному коду класса объекта? –

+0

Он не переопределял его, но теперь он работает, и он работает. Благодарю. – TheGateKeeper

ответ

8

Если вы переопределяете Equals, то всегда также переопределяйте GetHashCode.

Why is it important to override GetHashCode when Equals method is overridden?

Вот простой класс, чтобы продемонстрировать возможную реализацию. GetHashCode должны быть эффективными и должны производить несколько коллизий:

public class Foo 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public override bool Equals(object obj) 
    { 
     Foo other = obj as Foo; 
     if (other == null) return false; 
     return this.ID == other.ID; 
    } 

    public override int GetHashCode() 
    { 
     return ID; 
    } 
} 

Here's другую реализацию, если ваша проверка равенства должна включать в себя несколько свойств или коллекции:

public override int GetHashCode() 
{ 
    unchecked // Overflow is fine, just wrap 
    { 
     int hash = 17; 
     // Suitable nullity checks etc, of course :) 
     hash = hash * 23 + field1.GetHashCode(); 
     hash = hash * 23 + field2.GetHashCode(); 
     hash = hash * 23 + field3.GetHashCode(); 
     return hash; 
    } 
} 
+0

Спасибо за это, однако я не понимаю, почему вы задали значение 'hash' несколько раз. Не будет 'hash = hash * 23 + field3.GetHashCode();' переопределить все остальные строки? Разве это не должно быть '+ ='? – TheGateKeeper

+1

@TheGateKeeper: Это 'hash = hash * 23 + ...', поэтому он не перезаписывает его, а принимает старое старое значение и добавляет следующий хэш-код. –

+0

Dang, как я пропустил этот lol, спасибо товарищу! – TheGateKeeper

Смежные вопросы