Distinct()如何运作?

让我说我有这个:

class Foo { public Guid id; public string description; } var list = new List(); 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.EqualsReferenceEquals )。

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


请注意,使用匿名类确实返回3个元素。 根据您要使用Foo以及所需的编译时类型安全性,您可以执行以下操作:

 var list = new List(); 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.Default比较每两个项目,直到指定 IEqualityComparer的另一个实现