Distinct()如何运作?

时间:2013-03-15 02:18:05

标签: c# .net linq distinct

让我说我有这个:

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

2 个答案:

答案 0 :(得分:7)

您必须覆盖Foo.Equals(以及随后的Foo.GetHashCode)才能明确比较每个字段。否则,它将使用默认实现Object.EqualsReferenceEquals)。

或者,您可以明确地将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

答案 1 :(得分:6)

它使用EqualityComparer.Default比较每两项,直至specified IEqualityComparer的另一个实施