【发布时间】:2017-06-19 00:22:09
【问题描述】:
我有一个具有 3 个属性的 Vendor 对象:VendorId、CompanyName 和 Email:
我发现我可以重写 Equals 方法来比较两个供应商:
public override bool Equals(object obj)
{
if (obj == null || this.GetType() != obj.GetType())
return false;
Vendor v = (Vendor)obj;
if (v != null
&& v.CompanyName == this.CompanyName
&& v.Email == this.Email
&& v.VendorId == this.VendorId)
return true;
return base.Equals(obj);
}
...否则 C# 无法做到,因为它不知道两个供应商对象何时相等,除非我专门指示它比较两个供应商的每个对象属性。
现在,在我的单元测试中,我发现我实际上不仅可以比较供应商,还可以比较供应商列表:
CollectionAssert.AreEqual(listOfVendors1, listOfVendors2);
我得到的列表如下:
var listOfVendors1 = new List<Vendor>() {
new Vendor() { VendorId = 1, CompanyName="comp1", Email="e@yahoo.com" },
new Vendor() { VendorId = 2, CompanyName="comp2", Email="f@yahoo.com" }
};
对于第二个列表:
var listOfVendors2 = new List<Vendor>() {
new Vendor() { VendorId = 1, CompanyName="comp1", Email="e@yahoo.com" },
new Vendor() { VendorId = 2, CompanyName="comp2", Email="f@yahoo.com" }
};
我注意到当 CollectionAssert.AreEqual(listOfVendors1, listOfVendors2);处理完毕后,我的自定义 Equals 方法被调用,首先是 listOfVendors1.First() 和 listOfVendors2.First(),如果两个供应商的属性相等,则再次调用 Equals 方法,比较两者中的第二个元素列表。
我想了解使这成为可能的机制,因为我没有专门遍历这两个列表的元素。如何,何时完成迭代?我很困惑。
如果 Equals 旨在比较单个元素,它如何隐式比较(?)列表?例如Vendor1.Equals(Vendor2)
【问题讨论】:
-
CollectionAssert.AreEqual的文档指出:“如果两个集合具有相同顺序和数量的相同元素,则它们相等。如果它们的值相等,则元素相等,而不是如果它们引用到同一个对象。元素的值默认使用Equals进行比较。" - 其中哪一部分不清楚? -
我对查找和阅读文档相关部分感到厌烦的部分。感谢您指出 UnholySheep。
标签: c#