c#-检查复杂对象的相等性

c#-检查复杂对象的相等性,c#,C#,同一类的2个对象具有相同的信息,只有不同的列表索引具有数据交换。 我正在检查Linq Intersect和Except运算符,如何从它们那里获得预期结果?我有更复杂的对象,其中的列表包含列表。 下面关于调试的代码从不进入操作符方法。也许我在这里犯了个错误。 谁能指引我 样书类 class Book { public List<Chapter> Chapters { get; set; } public string Name { get; set; } } clas

同一类的2个对象具有相同的信息,只有不同的列表索引具有数据交换。 我正在检查Linq Intersect和Except运算符,如何从它们那里获得预期结果?我有更复杂的对象,其中的列表包含列表。 下面关于调试的代码从不进入操作符方法。也许我在这里犯了个错误。 谁能指引我

样书类

class Book
{
    public List<Chapter> Chapters { get; set; }
    public string Name { get; set; }
}

class Chapter
{
    public string name { get; set; }
    public List<Page> Pages { get; set; }
}

class Page
{
    public int number { get; set; }

}
这里有两个问题:

当书籍x和y有相同的章节时,x.chapters.Except(y.Chaters,…).Any()将为false(x没有任何不在y中的章节),因此条件应为

if (x.Chapters.Except(y.Chapters, new ChapterComparer()).Any() == false)
此外,在比较书籍时,您需要使用BookComparer:

var d = new BookComprarer().Equals(r1, r2);

如果使用IEqualityComparer,则不能仅使用Equals()。此外,您从中继承的:

我们建议您从EqualityComparer类派生,而不是实现IEqualityComparer接口

然后,你必须问问自己,一本书和另一本书相等意味着什么。如果可以是:

  • 两者都有相同的名称和章节,即使顺序不同
  • 两者都有相同的名称和相同的章节顺序
  • 如果使用选项1,则只需在比较之前对列表中的项目()进行排序(使用):


    Enumerable.SequenceEqual
    help?如果列表中的索引具有相同的数据,它会起作用,如果我交换数据,它就不起作用。可能是
    OrderBy
    It first?我有一个生产数据,其中对象具有需要比较的多级子对象。现在我有了一个更好的办法。非常感谢。
    public void TestMethod1()
        {
            Book r1 = GetLocalBook();
            Book r2 = GetBookUpdate();
    
    
            var d = r1.Equals(r2);
    
        }
    
    if (x.Chapters.Except(y.Chapters, new ChapterComparer()).Any() == false)
    
    var d = new BookComprarer().Equals(r1, r2);
    
    class BookComprarer : EqualityComparer<Book>
    {
        public override bool Equals(Book b1, Book b2)
        {
            if (b1 == null || b2 == null)
                return false;
            if (!string.Equals(b1.Name, b2.Name, StringComparison.OrdinalIgnoreCase))
                return false;
            ChapterComparer cmp = new ChapterComparer();
            //If you go with option 2, just use bx.Chapters;
            var c1 = b1.Chapters.OrderBy(x => x.Name.ToLower()); //ToLower so we ignore case
            var c2 = b2.Chapters.OrderBy(x => x.Name.ToLower());
            return c1.SequenceEquals(c2, cmp);
        }
    
        public override int GetHashCode(Book obj)
        {
            return obj.Name.GetHashCode();
        }
    }
    
    BookComparer cmp = new BoolComparer();
    Book b1 = GetLocalBook();
    Book b2 = GetBookUpdate();
    
    bool areBookEquals = cmp.Equals(b1, b2);