提问人:seanrco 提问时间:1/12/2023 最后编辑:M. Justinseanrco 更新时间:11/1/2023 访问量:277
LINQ SequenceEqual 返回 false,但使用 Except 进行比较会得到不同的结果
LINQ SequenceEqual returns false but comparing using Except gives different result
问:
我有两个我认为相等且顺序相同的列表,但是当我运行时,它返回.有关伪示例,请参见下文: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
实际上,我的列表数据要大得多(~项),但我很困惑为什么我会得到 0 而 false ?8000
Except().Count()
SequenceEqual()
答:
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 等。SequenceEqual
true
SequenceEqual
false
list1.Count != list2.Count
list1[0] != list2[0]
评论
0赞
seanrco
1/12/2023
@Dmitry Bychenko 感谢您的详细细分。就我而言(我将再次深入研究集合),我知道两者之间的计数是相同的,我相信要匹配的序列(我将对此进行更多调试)。但是,字符串值在两个列表中都包含重复项。根据您的描述,如果两个列表计数相等,顺序相同,但包含重复项,SequenceEqual 会返回 false 吗?
1赞
Dmitry Bychenko
1/12/2023
@OtoNoOto: 是最严格的比较,当且仅当两个列表的长度相同且 的第 -项 和 对于所有列表都相等时,它返回 。如您所见,重复项和订单都很重要。SequenceEqual
true
i
list1
list2
i
0赞
seanrco
1/12/2023
@Dmitry Bychenko:谢谢。接受这个作为答案,因为你在 SequenceEqual 和 Except 之间提供了非常详细的解释。我将不得不进一步调试我的数据。
评论
list1.SequenceEqual(list2)
Except
SequenceEqual
Except
new List<string>() {"1", "2", "3", "1"}.Except(new List<string>() {"3", "2", "1", "3"}).Count()
0
SequenceEquals
false