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

时间:2019-01-02 04:55:59

标签: 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; 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");
        }

2 个答案:

答案 0 :(得分:3)

SequenceEqual比较两个序列以查看包含的对象是否相同。就您而言,他们没有。它们包含不同的Product引用。

如果您更改代码以在每个列表中使用相同的Product,则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");
}

为什么?因为在此示例中,列表包含相同的对象。

Read this,了解有关SequenceEqual如何比较两个序列的更多信息。

如果您想让SequenceEqual类的属性相同,则Product返回true,那么您需要覆盖Equals类的Product方法。 / p>

编辑

正如其他人所提到的,最好是实现IEqualityComparer<T>接口,而不是直接覆盖Equals方法。

答案 1 :(得分:2)

默认情况下,SequenceEqual方法使用默认比较器对集合中的元素进行比较,该比较器会进行引用比较-请参见the official documentation page,尤其是 Examples 部分。

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

  • 具有Product类实现IEquatable<Product>接口;或
  • 创建一个单独的类,该类实现IEqualityComparer<Product>接口并使用SequenceEqual的重载,该重载采用IEqualityComparer<T>的实例

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