if (!list.SequenceEqual(new TESTList()))
{
MessageBox.Show("updated");
}
这段代码似乎不起作用。
我有一个课程;
class TESTList
{
private bool test;
}
现在,假设我的代码全部正常并且列表已正确创建,我如何通过检查列表中的每个项目(其布尔值)来确定两个列表是否相同,并确定两个项目的总体情况(例如item1 list1)和item1 list2)有相同的布尔值,然后两个列表相同。
我不知道。
答案 0 :(得分:3)
小心Enumerable.Zip
建议,因为它可能导致true
,其中2个输入序列长度不同,但匹配较短序列结束的点。如果其中一个序列为空而另一个序列不为,则甚至会导致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 };
TRUE
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 1, 2, 3, 4 };
FALSE
如果序列在任何顺序中包含相同的元素时需要true
的结果,则需要在比较它们之前对这两个序列进行排序:
bool result = list1.OrderBy (l => l).SequenceEqual(list2.OrderBy (l => l));
您应该注意SequenceEqual
使用列表中类型的默认相等比较器。这对于bool
开箱即用,但如果您的列表包含仅由私有字段区分的自定义类,则可能需要override Equals(我怀疑您的最终代码不会真正看起来那样的。)
答案 1 :(得分:2)
bool result = Enumerable.Zip(list1, list2, (left, right) => left == right).All(x => x);
答案 2 :(得分:0)
鉴于这是一个自定义类(更重要的是,test
字段是私有的),没有为LINQ编写的正确检查相等性的方法,因此它需要依赖于引用相等,每个列表指向相同的内存地址。没有特别的理由认为情况就是这样。
因此,您需要在Equals
中实施自定义TESTlist
方法。 (未测试)。
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
}
}