Sometimes, in .net it can get a bit confusing about which interface you need to implement for to get object equality to work correctly. When using the Distinct extension method in Linq, IEqualityComparer<T> is very useful
var items = new List<Cheese>(); items.Add(new Cheese { Name = "Cheddar" }); items.Add(new Cheese { Name = "Cheddar" }); items.Add(new Cheese { Name = "Red Leicester" }); items.Add(new Cheese { Name = "Stilton" }); var distinct = items.Distinct(); foreach (var item in distinct) { Console.WriteLine (item.Name); } //outputs // Cheddar // Cheddar // Red Leicester // Stilton
The key part is implementing GetHashCode so that the two objects will return the same hash code.
An example implementation:
class CheeseNameComparer : IEqualityComparer<Cheese> { public bool Equals (Cheese x, Cheese y) { return x.Name == y.Name; } public int GetHashCode (Cheese obj) { return obj.Name.GetHashCode(); } } distinct = items.Distinct(new CheeseNameComparer()); foreach (var item in distinct) { Console.WriteLine (item.Name); } //outputs // Cheddar // Red Leicester // Stilton