Distinct()如何运作?

oje*_*jek 3 .net c# 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" });
Run Code Online (Sandbox Code Playgroud)

现在,当我这样做时:

list = list.Distinct().Tolist();
Run Code Online (Sandbox Code Playgroud)

它显然返回4个元素.我想要一个方法,比较我在课堂上的所有数据,并返回唯一的元素,检查类的每个属性.我是否需要编写自己的比较器,或者是否存在内置的以这种方式工作的东西?

lc.*_*lc. 7

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

或者,您可以显式传递IEqualityComparerDistinct()方法.


请注意,使用匿名类确实返回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
Run Code Online (Sandbox Code Playgroud)

  • 我建议去`IEqualityComparer`路线.以这种方式将类扩展为在不同的上下文中"相等"要比覆盖`Equals`方法更容易. (3认同)

aba*_*hev 6

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