我认为最好的方法是在您模型中的所有类上实现等式运算符(如果您要进行比较,这通常也是一个好主意)。
class Book
{
public string Title { get; set; }
public string Author { get; set; }
public ICollection<Chapter> Chapters { get; set; }
public bool Equals(Book other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(other.Title, Title) && Equals(other.Author, Author) && Equals(other.Chapters, Chapters);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (Book)) return false;
return Equals((Book) obj);
}
public override int GetHashCode()
{
unchecked
{
int result = (Title != null ? Title.GetHashCode() : 0);
result = (result*397) ^ (Author != null ? Author.GetHashCode() : 0);
result = (result*397) ^ (Chapters != null ? Chapters.GetHashCode() : 0);
return result;
}
}
}
这段代码片段是由ReSharper自动生成的,但您可以将其用作基础。基本上,您需要使用自定义比较逻辑扩展未被覆盖的Equals方法。
例如,您可能希望使用Linq扩展中的SequenceEquals来检查章节集合是否按顺序相等。
现在,比较两本书就像简单地说一样:
Book book1 = new Book();
Book book2 = new Book();
book1.Title = "A book!";
book2.Title = "A book!";
bool equality = book1.Equals(book2); // returns true
book2.Title = "A different Title";
equality = book1.Equals(book2); // returns false
记住,还有一种实现相等性的方法:
System.IEquatable,该接口被System.Collections命名空间中的各种类用于确定相等性。我建议你也查看一下这个,这样你就可以顺利地进行了!