为什么List 的SequenceEqual返回false?

嗨,当我遇到这样的情况时,我遇到了一些有关sequenceEqual的问题:

Sentence s1 = new Sentence { Text = "Hi", Order = 1 }; Sentence s2 = new Sentence { Text = "Hello", Order = 2 }; List list1 = new List { s1, s2 }; List list2 = new List { s1, s2 }; 

这很好用

 bool equal = list1.SequenceEqual(list2); 

并返回true ;

但是当我有一些返回List ,例如:

 public List Getall() { Sentence s1 = new Sentence { Text = "Hi", Order = 1 }; Sentence s2 = new Sentence { Text = "Hello", Order = 2 }; return new List { s1, s2 }; } 

并像这样使用它:

 List list1 = Getall(); List list2 = Getall(); 

然后简单地检查一下

 bool equal = list1.SequenceEqual(list2); 

它返回’false’,请告诉我为什么? 以及如何使它工作?

你的问题是一个new Sentence { Text = "Hi", Order = 1 }不等于另一个new Sentence { Text = "Hi", Order = 1 } 。 虽然内容相同,但你有两个独立的对象,除非你设计了你的类,否则它们彼此并不相同,除非它们实际上是相同的对象(如你的第一个例子)。

你的Sentence类至少需要重写EqualsGetHashCode ,此时你的SequenceEquals应该再次工作。

正如MSDN在此处所述 :

通过使用类型的默认相等比较器比较元素来确定两个序列是否相等

在您的情况下, Sentence是具有默认EqualsGetHashCode的引用类型,这意味着它将使用每个元素的引用相等性。

您始终可以使用接受IEqualityComparer的重载

每次调用Getall()时,您都会创建两个新的Sentence实例。 在比较列表中的元素时, SequenceEqual将使用默认的相等比较器,它基本上只检查它们是否引用了sme对象:它们没有,因此它们是不同的。

你可以做的是覆盖Sequence中的Equal()==运算符,以便检查其他属性(如Text和Order)。

或者,您可以编写IEqualityComparer并将其传递给SequenceEqual