Sunday, April 3, 2011

How do i make sure that List<T>.Contains(T) works with my custom class?

I use .net 2.0 (C#)

I have a Person class, and i pupulate List< Person> p from the database.

i know for a fact that my list has duplicates, but when i try to remove the duplicates they don't get removed.

Does my Person class need to implement any interfaces for List< T>.Contains(T) to work properly?

Any other ideas?

Thank you.

From stackoverflow
  • The docs say "This method determines equality using the default equality comparer EqualityComparer(T).Default".

    Simon Buchan : Which trys `IEquatable`, then falls back on `.Equals()` and `.GetHashCode()`.
  • The example you reference is not a solution for removing dupes from a list, it is a function that takes a list and yields an iterator that will exclude duplicates. If you need to dedupe the entire list in one go you would need to take the IEnumerable<T> returned from the function and pass it into a new List<T>.

    roman m : thanx for detail, i used that code as a reference to fill a new List from the original by checking .Contains() on the new list on ever iteration
  • You need to overload Object.Equals(Object obj) in your class.

  • You should override Equals and GetHashCode method.

    BFree : While this DOES work, implementing IEquatable is better because it's type safe, whereas Equals is not.
    roman m : @BFree: good point
    redjackwong : Agree. But I think you should still override your GetHashCode method. This gives you better performance.
  • Your Person class should implement IEquatable

0 comments:

Post a Comment