【发布时间】:2020-03-06 09:11:36
【问题描述】:
我必须检查两个列表的相等性,包括它们的元素以及它们的序列。我正在使用以下,但它不起作用
public class SampleClass
{
public string Id { get; set; }
public string Name { get; set; }
}
[TestMethod]
public void EqualityTest()
{
var list1 = new List<SampleClass>
{
new SampleClass {Id = "11", Name = "abc"},
new SampleClass {Id = "22", Name = "xyz"}
};
var list2 = new List<SampleClass>
{
new SampleClass {Id = "11", Name = "abc"},
new SampleClass {Id = "22", Name = "xyz"}
};
Assert.IsTrue(Enumerable.SequenceEqual(list1, list2));
}
请提出任何解决方案。
【问题讨论】:
-
你可以实现IEquatable
-
默认情况下,比较将通过
object.ReferenceEqual()完成,因为SampleClass类型没有实现IEquatable<SampleClass>。您可以通过使SampleClass实现IEquatable<SampleClass>或使用接受合适IEqualityComparer<SampleClass>的SequenceEqual的重载来解决此问题。 -
抱歉,它不起作用并显示错误“CollectionAssert.AreEqual failed.(索引 0 处的元素不匹配。)”
-
因为它默认只比较references。你必须提供一些方法来比较你的类的两个实例,要么提供
IEqualityComparer,要么让你的类实现IEquatable<SampleClass>。仅仅因为SampleClass的两个实例共享相同的属性,并不意味着它们是相等的。