C# SequenceEqual在下面的比较类中不起作用

C# SequenceEqual在下面的比较类中不起作用,c#,generics,asp.net-core,.net-core,C#,Generics,Asp.net Core,.net Core,我试图比较以下数据。为什么SequenceEqual在下面不起作用?我创建了两个列表类,并希望进行比较 public partial class Product { public int ProductId { get; set; } public string ProductName { get; set; } public string ProductDescription { get;

我试图比较以下数据。为什么SequenceEqual在下面不起作用?我创建了两个列表类,并希望进行比较

        public partial class Product
        {
            public int ProductId { get; set; }
            public string ProductName { get; set; }
            public string ProductDescription { get; set; }
        }

        List<Product> product1 = new List<Product>();
        List<Product> product2 = new List<Product>();

        product1.Add(new Product
        {
            ProductId = 1,
            ProductName = "TV",
            ProductDescription = "Television Set"
        });

        product2.Add(new Product
        {
            ProductId = 1,
            ProductName = "TV",
            ProductDescription = "Television Set"
        });


        if (product1.SequenceEqual(product2))
        {
            Console.WriteLine("equal data");
        }
        else
        {
            Console.WriteLine("Not equal data");
        }
公共部分类乘积
{
public int ProductId{get;set;}
公共字符串ProductName{get;set;}
公共字符串ProductDescription{get;set;}
}
List product1=新列表();
List product2=新列表();
产品1.添加(新产品)
{
ProductId=1,
ProductName=“电视”,
ProductDescription=“电视机”
});
产品2.添加(新产品)
{
ProductId=1,
ProductName=“电视”,
ProductDescription=“电视机”
});
if(product1.SequenceEqual(product2))
{
控制台写入线(“相等数据”);
}
其他的
{
控制台写入线(“不相等数据”);
}

SequenceEqual
比较两个序列,以查看是否包含相同的对象。在你的情况下,他们没有。它们包含不同的
产品
引用

如果将代码更改为在每个列表中使用相同的
产品
,则
SequenceEqual
将返回'true'

var product = new Product
{
    ProductId = 1,
    ProductName = "TV",
    ProductDescription = "Television Set"
};

product1.Add(p);
product2.Add(p);


if (product1.SequenceEqual(product2))
{
    Console.WriteLine("equal data");
}
else
{
    Console.WriteLine("Not equal data");
}
为什么??因为在本例中,列表包含相同的对象

有关如何比较两个序列的更多信息,请参见
SequenceEqual

如果希望
SequenceEqual
Product
类的属性相同时返回true,则需要重写
Product
类上的
Equals
方法

编辑


正如其他人所提到的,更好的做法是实现接口,而不是直接重写
Equals
方法。

SequenceEqual
比较这两个序列以查看是否包含相同的对象。在你的情况下,他们没有。它们包含不同的
产品
引用

如果将代码更改为在每个列表中使用相同的
产品
,则
SequenceEqual
将返回'true'

var product = new Product
{
    ProductId = 1,
    ProductName = "TV",
    ProductDescription = "Television Set"
};

product1.Add(p);
product2.Add(p);


if (product1.SequenceEqual(product2))
{
    Console.WriteLine("equal data");
}
else
{
    Console.WriteLine("Not equal data");
}
为什么??因为在本例中,列表包含相同的对象

有关如何比较两个序列的更多信息,请参见
SequenceEqual

如果希望
SequenceEqual
Product
类的属性相同时返回true,则需要重写
Product
类上的
Equals
方法

编辑


正如其他人提到的,更好的做法是实现接口,而不是直接重写
Equals
方法。

默认情况下,
SequenceEqual
方法使用默认比较器比较集合中的元素,该比较器进行引用比较-请参阅,尤其是示例部分

如果要比较对象的数据而不是引用,有两个选项(我从上面链接的页面中选择):

  • Product
    类实现
    IEquatable
    接口;或
  • 创建一个实现
    IEqualityComparer
    接口的单独类,并使用以
    IEqualityComparer
    为实例的
    SequenceEqual
    重载

我建议您阅读文档页面,了解有关如何实现这两个选项的更多详细信息和示例。

默认情况下,
SequenceEqual
方法使用默认比较器比较集合中的元素,该比较器进行参考比较-请参阅,尤其是示例部分

如果要比较对象的数据而不是引用,有两个选项(我从上面链接的页面中选择):

  • Product
    类实现
    IEquatable
    接口;或
  • 创建一个实现
    IEqualityComparer
    接口的单独类,并使用以
    IEqualityComparer
    为实例的
    SequenceEqual
    重载
我建议您阅读文档页面,了解有关如何实现这两个选项的更多详细信息和示例。

如果没有(第三个示例下),您的代码只是比较引用,因为它们是两个不同的对象,所以它们是不同的。如果没有(第三个示例下),您的代码只是比较引用,它们是不同的,因为它们是两个不同的对象。