2010-06-14 264 views
4
IEnumerable<ReportReceipt> expected = new List<ReportReceipt>() 
{ 
    new ReportReceipt("fileName1","Hash1","some comments1") 
}; 

IEnumerable<ReportReceipt> actual = new List<ReportReceipt>() 
{ 
    new ReportReceipt("fileName1","Hash1","some comments1") 
}; 

Assert.IsTrue(expected.SequenceEqual(actual)); 

我運行MSTest的用VS 2008爲什麼這個Assert失敗?

回答

3

大概是因爲ReportReceipt不會覆蓋Equals - 所以它比較公正的引用,他們是不平等的。

適當地重寫EqualsGetHashCode它應該工作正常。

6

SequenceEqual通過使用默認相等比較器的類型比較元素來確定兩個序列是否相等。

如果您尚未重載類中的Equals和GetHashCode,則後備對象相等性檢查將失敗,因爲序列包含兩個不同的對象。

0

您是否重載了ReportReceipt的相等運算符? SequenceEqual方法是否不在內存中測試ReportReceipt的相等位置,而不是測試對象的內容?重寫Equals和GetHashCode應該可以解決你的問題。

添加類似以下內容ReportReceipt:

public override bool Equals(object obj) 
{ 
      if (obj == null || obj.GetType() != this.GetType) 
       return false; 
      ReportReceipt other = (ReportReceipt)obj; 
      return this.FileName.Equals(other.FileName) 
       && this.Hash.Equals(other.Hash); 
     } 
0

您比較參考對象的兩個不同的實例 - 因此,除非你的類型實現Equals檢查屬性值,而不是他們不相等引用。

爲了簡化操作,請使用CollectionAssert.AreEquivalent()

0

如果要使用你自己的比較器,以確定平等,可以用戶上MSDN

描述了本方法的過載基本上你將傳遞一個IEqualityComparer<TSource>作爲將被用於的元素比較參數。