【问题标题】:Find out, by lambda, whether a list contains an another list value通过 lambda 找出一个列表是否包含另一个列表值
【发布时间】:2013-01-14 09:55:39
【问题描述】:

我怎样才能通过 lambda 做到这一点?找出两个列表是否具有相同的值。

    void Main()
    {
        var list1 = new List<string>{
            "a", "b", "c"
        };

        var list2 = new List<string>{
            "c", "d", "e"
        };

        bool listsHaveSameValue = false;
        foreach(var list1Value in list1){
              listsHaveSameValue = list2.Any(c => c.Equals(list1Value));
              if(listsHaveSameValue){
                   break;
              }
        }

        Debug.WriteLine(listsHaveSameValue.ToString());
    }

【问题讨论】:

  • 您是否试图确定列表是否具有所有相同的值(即相同的列表但允许不同的顺序)? list2 是否具有 list1 的所有值?或者他们是否至少有一项共同点?
  • 您要求 lambda 的动机是什么?
  • 您当前的代码只检查最后一个值。
  • 这7个答案,没有一个对你没有帮助?
  • 使用 lambda 表达式的动机是让代码更短,而不需要循环另一个列表。

标签: c# list lambda


【解决方案1】:

你应该看看Intersect

var list1 = new List<string>{ "a", "b", "c"};
var list2 = new List<string>{ "c", "d", "e"};

var doubles = list1.Intersect(list2);
bool listsHaveSameValue = doubles.Any();

实际上并没有真正需要使用 lambda(如您所问)。

【讨论】:

    【解决方案2】:

    你应该使用Intersect

    var list3 = list2.Intersect(list1);
    

    list3 包含出现在两个列表中的元素

    【讨论】:

      【解决方案3】:

      这将检查是否存在至少一个公共元素。

      list1.Any(i => list2.Contains(i));
      

      【讨论】:

        【解决方案4】:
        list1.Intersect(list2).Any()
        

        应该返回真或假。

        【讨论】:

          【解决方案5】:

          尝试使用Enumerable.Intersect方法

          使用默认值生成两个序列的集合交集 相等比较器来比较值。

          public static void Main(string[] args)
                  {
                      var list1 = new List<string>{
                      "a", "b", "c"
                  };
          
                      var list2 = new List<string>{
                      "c", "d", "e"
                  };
          
                     IEnumerable<string> dubvalues = list2.Intersect(list1);
          
                      foreach (var i in dubvalues)
                      {
                          Console.WriteLine(i); // Output is c
                      }
                  }
          

          这是一个DEMO

          【讨论】:

            【解决方案6】:

            您正在有效地搜索最后一个值。

            判断所有元素是否相同(不考虑列表中的顺序)

            你应该使用

             listsHaveSameValue = listsHaveSameValue && list2.Any(c => c.Equals(list1Value));
            

            而不是

             listsHaveSameValue = list2.Any(c => c.Equals(list1Value));
            

            判断list1list2是否有相同元素的Linq方法之一是使用SequenceEqual

            listsHaveSameValue = list1.OrderBy(x=>x).SequenceEqual(list2.OrderBy(x=>x)
            

            【讨论】:

            • 不,这不是问题要问的。
            • @JLRishe 我理解,但部分问题是“我如何通过 lambda 做到这一点?”而“this”的逻辑是错误的
            • 你的第一行仍然没有意义。在上面的示例中,共同的项目恰好是 list1 中的最后一项,但问题没有表明提问者只想检查最后一项是否匹配。
            • 我同意你的观点并删除了第一行
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-08-01
            • 1970-01-01
            • 2022-12-31
            • 2017-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多