12

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

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

这很好用

bool equal = list1.SequenceEqual(list2);

并返回true

但是当我有一些返回List<Sentence> 例如的方法时:

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

        return new List<Sentence> { s1, s2 };
    }

并像这样使用它:

List<Sentence> list1 = Getall();
List<Sentence> list2 = Getall();

然后简单地检查一下

bool equal = list1.SequenceEqual(list2);

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

4

3 回答 3

19

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

您的Sentence班级需要覆盖,Equals并且GetHashCode至少,此时您SequenceEquals应该再次工作。

于 2013-02-19T13:00:06.360 回答
12

正如MSDN 在这里所说

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

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

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

于 2013-02-19T13:00:16.733 回答
2

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

What you can do is override the Equal() and == operators in Sequence to have equality check other properties (like Text and Order).

Alternatively you can write an IEqualityComparer<Sequence> and pass it to SequenceEqual

于 2013-02-19T13:04:01.717 回答