c#-检查复杂对象的相等性
同一类的2个对象具有相同的信息,只有不同的列表索引具有数据交换。 我正在检查Linq Intersect和Except运算符,如何从它们那里获得预期结果?我有更复杂的对象,其中的列表包含列表。 下面关于调试的代码从不进入操作符方法。也许我在这里犯了个错误。 谁能指引我 样书类c#-检查复杂对象的相等性,c#,C#,同一类的2个对象具有相同的信息,只有不同的列表索引具有数据交换。 我正在检查Linq Intersect和Except运算符,如何从它们那里获得预期结果?我有更复杂的对象,其中的列表包含列表。 下面关于调试的代码从不进入操作符方法。也许我在这里犯了个错误。 谁能指引我 样书类 class Book { public List<Chapter> Chapters { get; set; } public string Name { get; set; } } clas
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接口 然后,你必须问问自己,一本书和另一本书相等意味着什么。如果可以是:
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);