2017-06-18 51 views
0

我有3個屬性賣方對象:廠商ID,公司名稱和電子郵件:如果Equals是爲了比較單個元素而隱式比較列表是如何實現的?

我發現我可以重寫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="[email protected]" }, 
new Vendor() { VendorId = 2, CompanyName="comp2", Email="[email protected]" } 
}; 

和第二個列表:

var listOfVendors2 = new List<Vendor>() { 
new Vendor() { VendorId = 1, CompanyName="comp1", Email="[email protected]" }, 
new Vendor() { VendorId = 2, CompanyName="comp2", Email="[email protected]" } 
}; 

我注意到,當CollectionAssert.AreEqual(listOfVendors1,listOfVendors2);被處理時,我的自定義equals方法被調用時,首先爲listOfVendors1.First()和listOfVendors2.First(),並且如果兩個供應商的屬性是相等的,Equals方法被再次調用,從兩個的比較所述第二元件名單。

我想明白,使之成爲可能的機制,因爲我不這兩個表的內容具體迭代。如何,何時迭代完成?我很困惑。

怎樣的Equals比較含蓄(?)名單,如果打算到單個元素比較?例如Vendor1.Equals(供應商2)

+1

爲['CollectionAssert.AreEqual'](https://msdn.microsoft.com/en-us/library/ms243763文檔。aspx)指出:*「如果兩個集合在相同的順序和數量中具有相同的元素,則它們是相等的;如果它們的值相等,則元素相等,如果它們引用相同的對象則不相等;元素的值使用」Equals '默認情況下。「* - 哪部分不清楚? – UnholySheep

+0

我在尋找和閱讀文檔相關部分時遇到的部分。感謝您指出UnholySheep。 –

回答

0

CollectionAssert.AreEqual(listOfVendors1, listOfVendors2);

將在內部遍歷你的清單,並檢查是否所有項目相匹配的價值和秩序。爲了確定對象的相等它會使用自定義Equals方法(如果可用),否則將使用默認的比較。

4

我想了解使這成爲可能的機制,因爲我沒有專門通過兩個列表中的元素進行迭代。如何,何時迭代完成?我很困惑。

SequenceEqual方法的功能與您的CollectionAssert.AreEqual方法幾乎完全相同。如果你想知道它是如何工作的,你可以在這裏閱讀源代碼:

https://github.com/Microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs

總結:它遍歷在同一迴路兩個序列,並呼籲每個元素對相等。

如果您需要做的比較平等的兩個序列繪製的元素對其他的東西,你可以使用Zip順序操作;如果你看看它的實現,你會發現它不會令人驚訝地類似於SequenceEqual