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个元素。我想要一个方法,比较类中的所有数据,并返回唯一元素,检查类的每个属性。我需要写自己的比较器吗,还是有一些内置的东西以这种方式工作?
您必须重写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