4

可以说我有这个:

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 个元素。我想要一个方法,它比较我在类中的所有数据,并返回唯一元素,检查类的每个属性。我是否需要编写自己的比较器,或者是否有内置的东西可以这样工作?

4

2 回答 2

7

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

或者,您可以显式地将 an 传递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
于 2013-03-15T02:25:13.930 回答
6

它使用EqualityComparer.Default比较每两个项目,直到指定IEqualityComparer的另一个实现

于 2013-03-15T02:19:42.040 回答