【问题标题】:Compare two lists via LINQ in c#?在 c# 中通过 LINQ 比较两个列表?
【发布时间】:2014-12-21 06:15:12
【问题描述】:
if (!list.SequenceEqual(new TESTList()))
{
     MessageBox.Show("updated");
}

几乎这段代码似乎不起作用。

我有这样的课;

class TESTList
{
private bool test;
}

现在,假设我的代码一切正常并且列表已正确创建,我如何通过检查列表中的每个项目(其布尔值)并确定两个项目(例如 item1 list1和 item1 list2) 具有相同的布尔值,那么两个列表相同。

我不知道。

【问题讨论】:

  • 两个列表是否都包含TESTlist 项目,或者是一个普通的布尔值还是其他?
  • 都包含 TESTlist 项!

标签: c# .net linq


【解决方案1】:

小心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 };

是的

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 来说是开箱即用的,但如果您的列表包含一个仅由私有字段区分的自定义类,您可能需要override Equals(我怀疑您的最终代码看起来不会像那样)。

【讨论】:

    【解决方案2】:
    bool result = Enumerable.Zip(list1, list2, (left, right) => left == right).All(x => x);
    

    【讨论】:

    • 这是一个布尔返回吗?什么?
    • 如果相同则返回true?
    • 您的 OP 问题毫无意义。但是,是的,当它们相同时,它会返回 true dotnetfiddle.net/SAwIN1
    【解决方案3】:

    鉴于这是一个自定义类(更重要的是,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
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多