LINQ SequenceEqual 返回 false,但使用 Except 进行比较会得到不同的结果

LINQ SequenceEqual returns false but comparing using Except gives different result

提问人:seanrco 提问时间:1/12/2023 最后编辑:M. Justinseanrco 更新时间:11/1/2023 访问量:277

问:

我有两个我认为相且顺序相同的列表,但是当我运行时,它返回.有关伪示例,请参见下文:SequenceEqual()false

// For brevity’s sake assume the two-list data is as follows
List<string> list1 = new List<string> {"1", "2", "3"};
List<string> list2 = new List<string> {"1", "2", "3"};

list1.SequenceEqual(list2); // returning false
list1.Except(list2).Count(); // returning 0
list2.Except(list1).Count(); // returning 0

实际上,我的列表数据要大得多(~项),但我很困惑为什么我会得到 0false8000Except().Count()SequenceEqual()

C# .NET LINQ 相等性

评论

2赞 Jon Skeet 1/12/2023
请提供一个实际的最小可重复示例。在示例代码中,将返回 true,并且两个调用都将返回一个空序列 - 而不是整数。list1.SequenceEqual(list2)Except
2赞 Jon Skeet 1/12/2023
下面是一个完整的示例,显示您提供的列表返回 true: gist.github.com/jskeet/766bda056c4d676177ac5f5ae396f8b6SequenceEqual
2赞 Jon Skeet 1/12/2023
(Except 可以返回空序列而 SequenceEqual 返回 false 的原因有很多 - 显而易见的是由于排序或重复元素。如果没有一个实际的最小可重复的例子,很难说更多。
1赞 Anand Sowmithiran 1/12/2023
您的清单中包含哪些内容?它们是原始类型还是自定义对象?如果元素是您的业务对象,并且您希望使用自定义逻辑比较两个对象,则可以提供相等比较器类。
1赞 Dmitry Bychenko 1/12/2023
请注意,删除重复项并且不考虑顺序,这就是为什么在返回时会返回的原因Exceptnew List<string>() {"1", "2", "3", "1"}.Except(new List<string>() {"3", "2", "1", "3"}).Count()0SequenceEqualsfalse

答:

2赞 Dmitry Bychenko 1/12/2023 #1

你做不同的比较。至于它Except

  • 删除重复项
  • 不考虑项目的顺序
  • 如果第二个参数中的项在第一个参数中不存在,则忽略这些项

这就是为什么

// Duplicated "2" will be ignored
List<string> list1 = new List<string>() { "1", "2", "3", "2" };
// Duplicated "3" will be ignored
// Order doesn't matter
// "7777777" will be ignored
List<string> list2 = new List<string>() { "3", "3", "1", "2", "7777777"};

// 0; since all items within list1 - "1", "2", "3"
// are in the list2, duplicates ignored
int count = list1.Except(list2).Count();

When 返回当且仅当序列顺序相等且重复很重要。在上面的示例中,返回 since 等。SequenceEqualtrueSequenceEqualfalselist1.Count != list2.Countlist1[0] != list2[0]

评论

0赞 seanrco 1/12/2023
@Dmitry Bychenko 感谢您的详细细分。就我而言(我将再次深入研究集合),我知道两者之间的计数是相同的,我相信要匹配的序列(我将对此进行更多调试)。但是,字符串值在两个列表中都包含重复项。根据您的描述,如果两个列表计数相等,顺序相同,但包含重复项,SequenceEqual 会返回 false 吗?
1赞 Dmitry Bychenko 1/12/2023
@OtoNoOto: 是最严格的比较,当且仅当两个列表的长度相同且 的第 -项 和 对于所有列表都相等时,它返回 。如您所见,重复项和订单都很重要。SequenceEqualtrueilist1list2i
0赞 seanrco 1/12/2023
@Dmitry Bychenko:谢谢。接受这个作为答案,因为你在 SequenceEqual 和 Except 之间提供了非常详细的解释。我将不得不进一步调试我的数据。