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