Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#列表比较_C#_List_Comparison - Fatal编程技术网

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)));

您尝试比较两个不同对象的引用。你必须把这两张单子的内容核对一下。查看一下

可能重复此问题揭示了您在理解值和引用之间的差异时存在的问题,这可能会有所帮助