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));
我正在使用VS 2008运行MSTest。
答案 0 :(得分:6)
SequenceEqual通过使用类型的默认相等比较器比较元素来确定两个序列是否相等。
如果您没有在类中重载Equals和GetHashCode,则回退对象相等性检查将失败,因为序列包含两个不同的对象。
答案 1 :(得分:3)
大概是因为ReportReceipt没有覆盖Equals
- 所以它只是比较引用,而且它们是不相等的。
适当地覆盖Equals
和GetHashCode
,它应该可以正常工作。
答案 2 :(得分: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);
}
答案 3 :(得分:0)
您正在比较两个不同的引用对象实例 - 因此,除非您在类型上实现Equals
来检查属性值而不是引用,否则它们将不相等。
为方便起见,请改用CollectionAssert.AreEquivalent()
。
答案 4 :(得分:0)
如果您想使用自己的比较器来确定相等性,您可以使用MSDN
中描述的此方法的重载基本上,您将传递IEqualityComparer<TSource>
作为参数,用于比较元素。