How does Distinct() work?

时光毁灭记忆、已成空白 提交于 2019-12-17 21:06:28

问题


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?


回答1:


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



回答2:


It compares each two items using EqualityComparer.Default until specified another implementation of IEqualityComparer



来源:https://stackoverflow.com/questions/15423632/how-does-distinct-work

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!