如何检查列表中对象的属性是否相等?

Aԃι*_*ɾαʋ 1 .net c# .net-core

我的列表中有两个对象,并且希望确保这些对象的所有属性都具有相同的值。

例如:

List<Person> persons = new List<Person>
{
    new Person { Id = "1", Name = "peter" },
    new Person { Id = "1", Name = "peter" }
};
Run Code Online (Sandbox Code Playgroud)

现在我想知道true两个对象的属性是相同的。我尝试过以下 lambda 表达式。

var areEqual = persons.All(o => o == persons.First());
Run Code Online (Sandbox Code Playgroud)

但我要false进去了areEqual。我无法理解为什么会这样,并且想知道如何正确地做到这一点。

nvo*_*igt 5

您可以使用以下方法查明所有元素是否相同:

persons.Distinct().Count() == 1
Run Code Online (Sandbox Code Playgroud)

如果它为零,则首先没有条目,如果它大于 1,则有不相同的条目。

现在...如何确保调用.Distinct()知道两个对象何时相同?

  • 选项 1:Person已经是record. 伟大的。内置功能。完毕。

  • 选项 2:Person实施IEquatable<Person>并执行您想要的检查。

  • 选项 3:以您需要的方式自行覆盖PersonObject.EqualsObject.GetHashCode

  • 选项 4:Person不是以上任一选项,并且您不想更改它来选中其中一个框。然后您仍然可以实现自己的实例IEqualityComparer<Person>并将其实例传递给不同的方法,如下所示:

    persons.Distinct(new MyCustomPersonEqualityComparer()).Count() == 1
    
    Run Code Online (Sandbox Code Playgroud)