C#列表比较
这是假的。为什么会这样?我怎样才能使它打印出来? 我的目标是有一个用户可以编辑的人员列表和临时人员列表。在用户编辑结束时,我想检查临时列表是否与原始列表不同,以便检查程序是否需要保存新编辑的列表C#列表比较,c#,list,comparison,C#,List,Comparison,这是假的。为什么会这样?我怎样才能使它打印出来? 我的目标是有一个用户可以编辑的人员列表和临时人员列表。在用户编辑结束时,我想检查临时列表是否与原始列表不同,以便检查程序是否需要保存新编辑的列表 static void EqualLists() { List<Person> listA = new List<Person>(); List<Person> listB = new List<Person>();
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");
}
}
static void EqualLists()
{
List listA=新列表();
List listB=新列表();
人员a=新人员()
{
name=“John”,
年龄=18
};
人员b=新人员()
{
name=“John”,
年龄=18
};
列表a.添加(a);
清单b.添加(b);
if(listA==listB)
{
Console.WriteLine(“真”);
}
其他的
{
控制台。写入线(“假”);
}
}
首先,我们需要定义平等的含义。您的意思显然是“列表具有相同的语义内容”,但:
是引用比较,这意味着“是相同的实际列表实例”如果(listA==listB)
- 这可以通过使用
进行调整,但这需要知道每个项目的相等性意味着什么listA.SequenceEqual(listB)
- 默认情况下,这将使用
,对于引用类型,默认为“如果它们是相同的对象实例,则它们是相等的”EqualityComparer.default
- 要解决这个问题,您需要正确覆盖
和GetHashCode()
(理想情况下还需要实现Equals(object)
)IEquatable
var same = listA.Select(p => (p.age, p.name)).SequenceEqual(
listB.Select(p => (p.age, p.name)));
您尝试比较两个不同对象的引用。你必须把这两张单子的内容核对一下。查看一下可能重复此问题揭示了您在理解值和引用之间的差异时存在的问题,这可能会有所帮助