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