C#列表比较

问题描述

此打印错误。为什么会这样,如何使它打印正确? 我的目标是要有用户可以编辑的人员列表和临时人员列表。在用户编辑结束时,我要检查临时列表是否与原始列表有所不同,因此我可以检查程序是否应该麻烦保存新编辑的列表。

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)进行调整,但是 this 然后需要知道每个项目的相等性
  • 默认情况下,这将使用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