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

时间:2014-12-21 06:15:12

标签: c# .net linq

if (!list.SequenceEqual(new TESTList()))
{
     MessageBox.Show("updated");
}

这段代码似乎不起作用。

我有一个课程;

class TESTList
{
private bool test;
}

现在,假设我的代码全部正常并且列表已正确创建,我如何通过检查列表中的每个项目(其布尔值)来确定两个列表是否相同,并确定两个项目的总体情况(例如item1 list1)和item1 list2)有相同的布尔值,然后两个列表相同。

我不知道。

3 个答案:

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