在 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(具有相同的布尔值,那么两个列表是否相同。

我不知道。

在 c# 中通过 LINQ 比较两个列表

小心

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
    }
  }