C# 使用IComparer比较两个列表
我有两个类型C# 使用IComparer比较两个列表,c#,list,C#,List,我有两个类型动物(一个属性为品种和名称的类)的列表,我需要在单元测试中使用CollectionAssert [TestMethod] public void Test() { List<Animal> list1 = new List<Animal> () { new Animal("Dog", "Charlie"), new Animal("Cat", "Mittens"), new Animal("Cow",
动物
(一个属性为品种
和名称
的类)的列表,我需要在单元测试中使用CollectionAssert
[TestMethod]
public void Test()
{
List<Animal> list1 = new List<Animal> ()
{
new Animal("Dog", "Charlie"),
new Animal("Cat", "Mittens"),
new Animal("Cow", "Bacon"),
};
List<Animal> list2 = new List<Animal> ()
{
new Animal("Dog", "Charlie"),
new Animal("Cat", "Mittens"),
new Animal("Cow", "Bacon"),
};
CollectionAssert.AreEqual(list1,list2);
}
现在,当我尝试将比较器作为参数添加到CollectionAssert.AreEqual
中时,方法仍然不起作用
CollectionAssert.AreEqual(list1,list2, "true", new CustomComparer())
测试仍然失败,并显示相同的消息错误。您可以通过实现非通用基本接口来覆盖Equals或:
public class CustomCompare : IComparer<Animal>, IComparer
{
public int Compare(Animal a, Animal b)
{
return String.Compare(a.Name, b.Name);
}
int IComparer.Compare(object x, object y)
{
return Compare((Animal)x, (Animal)y);
}
}
或;使用自定义消息:
CollectionAssert.AreEqual(list1, list2, new CustomCompare(), "true");
您可以通过实现非泛型基本接口来重写Equals或:
public class CustomCompare : IComparer<Animal>, IComparer
{
public int Compare(Animal a, Animal b)
{
return String.Compare(a.Name, b.Name);
}
int IComparer.Compare(object x, object y)
{
return Compare((Animal)x, (Animal)y);
}
}
或;使用自定义消息:
CollectionAssert.AreEqual(list1, list2, new CustomCompare(), "true");
Yo集合包含不同的对象,引用类型是按引用相等性而不是按值进行比较的。至于自定义比较器,您使用了无效重载的
AreEqual
方法和不正确的IComparer
实现,它应该是非通用比较器。您希望添加一个自定义比较器来比较名称,所以我建议改为使用:CollectionAssert.AreEqual(list1.Select(x=>x.Name),list2.Select(x=>x.Name))
使用Equals
的精确副本将解决问题,如果副本中建议的方法(在动物类中重写Equals和GetHashCode)更适合,请告诉我,我可以删除答案。@Sajid您的方法似乎最简单,但如果其他人需要,您还必须添加.ToList()由于CollectionAssert.AreEqual()需要ICollection,而Select方法将返回包含不同对象的IEnumerableYo集合,因此引用类型是按引用相等性而不是按值进行比较的。至于自定义比较器,您使用了无效重载的AreEqual
方法和不正确的IComparer
实现,它应该是非通用比较器。您希望添加一个自定义比较器来比较名称,所以我建议改为使用:CollectionAssert.AreEqual(list1.Select(x=>x.Name),list2.Select(x=>x.Name))
使用Equals
的精确副本将解决问题,如果副本中建议的方法(在动物类中重写Equals和GetHashCode)更适合,请告诉我,我可以删除答案。@Sajid您的方法似乎最简单,但如果其他人需要,您还必须添加.ToList()因为CollectionAssert.AreEqual()需要ICollection,而Select方法将返回IEnumerable