C# 为什么列表的SequenceEqual<;T>;返回false?
嗨,当我遇到这样的情况时,我有一些问题:C# 为什么列表的SequenceEqual<;T>;返回false?,c#,list,comparison,C#,List,Comparison,嗨,当我遇到这样的情况时,我有一些问题: 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&
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 };
List<Sentence> list1 = Getall();
List<Sentence> list2 = Getall();
并返回true
但是当我有一些方法返回List
例如:
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 };
}
它返回“false”,请告诉我为什么?你的问题是一个
新句子{Text=“Hi”,Order=1}
不等于另一个新句子{Text=“Hi”,Order=1}
。尽管内容是相同的,但您有两个独立的对象,除非您设计了类,否则它们彼此不相等,除非它们是字面上相同的对象(如第一个示例中所示)
您的语句
类需要重写,至少在这一点上,您的SequenceEquals
应该再次工作。如下所示:
通过使用元素类型的默认相等比较器对元素进行比较,确定两个序列是否相等。
在您的例子中,语句是一种引用类型,默认值为等于和GetHashCode
,这意味着它将对每个元素使用引用相等
每次调用Getall()
时,您总是可以使用创建两个新句子实例的。比较列表中的元素时,SequenceEqual
将使用默认的相等比较器,它基本上只是检查它们是否引用sme对象:它们没有引用,因此它们是不同的
您可以做的是依次重写Equal()
和==
运算符,以便对其他属性(如文本和顺序)进行相等检查
或者,您可以编写一个IEqualityComparer
并将其传递给SequenceEqual
,因为在第二种情况下,它们是不同的对象,即它们的GetHash()方法返回不同的值。在第一种情况下,它们是具有两个不同引用的完全相同的对象。关于使用比较器而不是在类本身中定义行为的可能性,这一点很好。这个答案很接近,但PatrykĆwiek建议使用IEqualityComparer的答案是我的解决方案。
List<Sentence> list1 = Getall();
List<Sentence> list2 = Getall();
bool equal = list1.SequenceEqual(list2);