Distinct()是如何工作的

本文关键字:工作 Distinct 何工作 | 更新日期: 2023-09-27 18:03:54

假设我有这个:

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" });

现在,当我这样做的时候:

list = list.Distinct().Tolist();

显然返回4个元素。我想要一个方法,比较类中的所有数据,并返回唯一元素,检查类的每个属性。我需要写自己的比较器吗,还是有一些内置的东西以这种方式工作?

Distinct()是如何工作的

您必须重写Foo.Equals(以及随后的Foo.GetHashCode)以显式比较每个字段。否则,它将使用默认实现Object.Equals (ReferenceEquals)。

或者,您可以显式地将IEqualityComparer传递给Distinct()方法。


注意,使用匿名类返回3个元素。根据您希望在何处使用Foo以及需要多少编译时类型安全性,您可以这样做:

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

它使用EqualityComparer比较每两个项。默认,直到指定另一个实现的IEqualityComparer