C# 列表比较

C# List comparison

这会打印出错误。为什么会这样,我怎样才能让它打印成真的? 我的目标是拥有一个人员列表和一个用户可以编辑的临时人员列表。在用户编辑结束时,我想检查临时列表是否与原始列表有任何不同,这样我就可以检查程序是否应该保存新编辑的列表。

static void EqualLists()
    {
        List<Person> listA = new List<Person>();
        List<Person> listB = new List<Person>();
        Person a = new Person()
        {
            name = "John",
            age = 18
        };
        Person b = new Person()
        {
            name = "John",
            age = 18
        };
        listA.Add(a);
        listB.Add(b);

        if(listA == listB)
        {
            Console.WriteLine("true");
        }
        else
        {
            Console.WriteLine("false");
        }
    }

首先,我们需要定义平等的含义。您的意思显然是“列表具有相同的语义内容”,但是:

  • if(listA == listB)是引用比较,意思是“都是相同的实际列表实例”
  • 这可以通过使用 listA.SequenceEqual(listB) 进行调整,但是 然后需要知道每个项目的相等性意味着什么
  • 默认情况下,这将使用 EqualityComparer<T>.Default,对于 引用类型 ,默认为“如果它们是相同的对象实例,则它们是相等的”
  • 要修复 您需要正确覆盖 GetHashCode()Equals(object)(并且 理想情况下 实施 IEquatable<T>)

更简单的方法可能是:

var same = listA.Select(p => (p.age, p.name)).SequenceEqual(
    listB.Select(p => (p.age, p.name)));

您尝试比较两个不同对象的引用。您必须比较这两个列表的内容。看看 https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.sequenceequal?view=netcore-3.1