【问题标题】:Find if listA contains any elements not in listB查找列表是否包含任何不在列表中的元素
【发布时间】:2012-03-20 10:44:41
【问题描述】:

我有两个列表:

List<int> listA     
List<int> listB

如何使用 LINQ 检查 listA 中是否存在 listB 中不存在的元素?我可以使用foreach 循环,但我想知道我是否可以使用 LINQ 来做到这一点

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    listA.Except(listB) 将为您提供 listA 中不在 listB 中的所有项目

    【讨论】:

    • 是的,它会这样做。但由于这是一个基于集合的操作,因此值得记住的是,结果列表还将删除 ListA 或 ListB 中存在的重复项。
    【解决方案2】:
    if (listA.Except(listB).Any())
    

    【讨论】:

      【解决方案3】:
      listA.Any(_ => listB.Contains(_))
      

      :)

      【讨论】:

      • 这是最好的答案,因为@cadrell0 和 SLaks 提供的解决方案只会检查 A 是否包含 B 的所有元素,但不会检查 B 是否有更多与 A 不匹配的元素。这个解决方案是有效的例如下面。答:[0,1,2,3]; B:[0,1,2,3,4]listA.Except(listB).Any() == falselistA.Any(_ =&gt; listB.Contains(_)) == true
      • @TomaszJuszczak 是的,但该问题仅在 A 包含 B 中不包含的任何内容时才明确提出 - 即如果 B 包含 A 中不包含的内容,则它应该评估为 false,前提是 A 没有t 包含 B 中没有的东西。所以这个答案是不正确的。 (是的,我第一次阅读时误解了这个问题。)
      • 当您实际使用来自 Any 的值时,您不应使用丢弃 (_),因为这意味着(对开发人员和编译器)您不关心值
      【解决方案4】:

      你可以在一行中完成

      var res = listA.Where(n => !listB.Contains(n));
      

      这不是最快的方法:如果listB比较长,这应该更快:

      var setB = new HashSet(listB);
      var res = listA.Where(n => !setB.Contains(n));
      

      【讨论】:

        【解决方案5】:

        List 有包含返回 bool 的方法。我们可以在查询中使用该方法。

        List<int> listA = new List<int>();
        List<int> listB = new List<int>();
        listA.AddRange(new int[] { 1,2,3,4,5 });
        listB.AddRange(new int[] { 3,5,6,7,8 });
        
        var v = from x in listA
                where !listB.Contains(x)
                select x;
        
        foreach (int i in v)
            Console.WriteLine(i);
        

        【讨论】:

          【解决方案6】:

          使用Any() 获取两个列表的差异。如果满足条件,Linq Any() 函数会返回一个布尔值,但您可以使用它来返回两个列表的差异:

          var difference = ListA.Where(a => !ListB.Any(b => b.ListItem == a.ListItem)).ToList();
          

          【讨论】:

            【解决方案7】:

            这段代码比较了两个列表,它们都包含一个 CultureCode 字段,例如“en-GB”。这将在列表中留下不存在的翻译。 (我们需要一个用于文章未翻译语言的下拉列表)

            var compared = supportedLanguages.Where(sl =&gt; !existingTranslations.Any(fmt =&gt; fmt.CultureCode == sl.Culture)).ToList();

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-05-18
              • 1970-01-01
              • 2014-07-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-08-18
              相关资源
              最近更新 更多