How does Distinct() work?

.net, c#, distinct, linq

Solution

You have to override `Foo.Equals` (and subsequently `Foo.GetHashCode`) to explicitly compare each field. Otherwise it will use the default implementation, `Object.Equals` (`ReferenceEquals`).

Or, you can explicitly pass an `IEqualityComparer` to the `Distinct()` method.

Note though that using anonymous classes does return 3 elements. Depending on where you want to use `Foo` and how much compile-time type safety you need, you could do:

var list = new List<dynamic>();
list.Add(new { id = Guid.Empty, description = "empty" });
list.Add(new { id = Guid.Empty, description = "empty" });
list.Add(new { id = Guid.NewGuid(), description = "notempty" });
list.Add(new { id = Guid.NewGuid(), description = "notempty2" });

list = list.Distinct().ToList(); //3 elements selected

Problem

Lets say i have this: ``` class Foo { public Guid id; public string description; } var list = new List<Foo>(); list.Add(new Foo() { id = Guid.Empty, description = "empty" }); list.Add(new Foo() { id = Guid.Empty, description = "empty" }); list.Add(new Foo() { id = Guid.NewGuid(), description = "notempty" }); list.Add(new Foo() { id = Guid.NewGuid(), description = "notempty2" }); ``` Now, when i do this: ``` list = list.Distinct().Tolist(); ``` It obviously returns 4 elements. I would like a method, that compares all the data i have in class, and returns unique elements, something that checks every property of the class. Do i need to write my own comparer, or is there something that is built-in that works this way?

Original source