我正在尝试比较以下数据。为什么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");
}
答案 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>
的实例我建议您阅读文档页面,以获取有关如何实现这两个选项的更多详细信息和示例。