嵌套对象上的EqualityComparer

时间:2018-08-26 15:02:47

标签: c#

我想比较两个嵌套对象列表。如果父对象var description = '1 2 3 4 5 6 7 8 9 10 11 12 13 14' function limitLength(str, length, exclude) { var i = 0 for (var count = 0 ; i < str.length && count < length; i++) { if (!str[i].match(exclude)) { count++ } } return str.substr(0, i) } description = limitLength(description, 15, /([\s])/) console.log(description)不同和/或子对象IdId的属性不同,则我认为它们已更改。

我已经在下面实现了自己的BazEquals版本,但是尽管使用了自己的相等比较器,但GetHashCode仍会产生结果,而我希望对象是相等的。

Except()
var foo1 = new Foo
{
    Id = 1,
    Bars = new List<Bar>
    {
        new Bar
        {
            Id = 1,
            Baz = 1.5
        },
        new Bar
        {
            Id = 1,
            Baz = 1.5
        }
    }
};

var foo2 = new Foo
{
    Id = 1,
    Bars = new List<Bar>
    {
        new Bar
        {
            Id = 1,
            Baz = 1.5
        },
        new Bar
        {
            Id = 1,
            Baz = 1.5
        }
    }
};

var diff = new[] { foo1 }.Except(new[] { foo2 });

1 个答案:

答案 0 :(得分:4)

您的代码中有三点错误:

  1. 您没有将相等比较器传递给Except方法,因此没有被使用。
  2. 您在GetHashCode中的Foo实现是错误的,它为相同的对象返回不同的结果,因此永远不会调用Equals方法。
  3. 您在两个列表上调用equals:Equals(x.Bars, y.Bars),这将检查引用是否相等。您可以使用SequenceEqual来逐一比较元素:x.Bars.SequenceEqual(y.Bars)