Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
113 views
Welcome To Ask or Share your Answers For Others

1 Answer

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...