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