在 c# 中通过 LINQ 比较两个列表
本文关键字:两个 列表 比较 LINQ | 更新日期: 2023-09-27 18:34:47
if (!list.SequenceEqual(new TESTList()))
{
MessageBox.Show("updated");
}
几乎这段代码似乎不起作用。
我有这样的课程;
class TESTList
{
private bool test;
}
现在,假设我的代码都有效并且列表已正确创建,我如何通过检查列表中的每个项目(其布尔值(并确定如果两个项目(例如 item1 list1 和 item1 list2(具有相同的布尔值,那么两个列表是否相同。
我不知道。
小心
Enumerable.Zip
建议,因为它可能会导致 2 个输入序列长度不同但匹配到较短序列结束点的true
。如果其中一个序列为空而另一个为空,甚至会导致true
!
result
这里将true
:
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 1, 2, 3, 4 };
bool result = Enumerable.Zip(list1, list2, (left, right) => left == right).All(x => x);
相反,您可能希望使用 SequenceEqual:
bool result = list1.SequenceEqual(list2);
结果:
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 1, 2, 3 };
真
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 1, 2, 3, 4 };
假
如果当序列以任何顺序包含相同元素时需要true
的结果,则需要在比较它们之前对两个序列进行排序:
bool result = list1.OrderBy (l => l).SequenceEqual(list2.OrderBy (l => l));
您应该注意,SequenceEqual
对列表中的类型使用默认相等比较器。 这对于bool
来说是开箱即用的,但是如果您的列表包含一个仅通过私有字段区分的自定义类,则可能需要覆盖 Equals(我怀疑您的最终代码看起来并非如此(。
bool result = Enumerable.Zip(list1, list2, (left, right) => left == right).All(x => x);
鉴于这是一个自定义类(更重要的是,test
字段是私有的(,因此无法为 LINQ 编写正确检查相等性,因此它需要回退到引用相等,其中每个列表指向相同的内存地址。没有特别的理由认为是这种情况。
因此,您需要在 TESTlist
中实现自定义Equals
方法。(未经测试。
public overrides bool Equals(object other) {
var tlo = other as TESTlist;
if (tlo != null) {
return tlo.test == this.test;
}
else {
return false; // It's not a TESTlist, it can't be equal
}
}