【问题标题】:Simplify conventional foreach nested loop using linq & lambda expression使用 linq 和 lambda 表达式简化传统的 foreach 嵌套循环
【发布时间】:2013-07-26 09:25:36
【问题描述】:

(见下面我的代码sn-p)我想找到coll1的所有项目与coll2的项目匹配(coll2的项目数

        var coll1 = new List<int>() { 1, 2, 3, 4, 5 };
        var coll2 = new List<int>() { 2, 4 };
        var coll3 = new List<int>();
        foreach ( var selected in coll2 )
        {
            foreach ( var item in coll1 )
            {
                if ( selected == item )
                {
                    coll3.Add(item);
                }
            }
        }

【问题讨论】:

    标签: c# linq lambda nested-loops


    【解决方案1】:

    您可以使用Intersect

    coll1.Intersect(coll2);
    

    但这不会按预期工作(参见 King King 的评论)..您可以改为这样做

    coll2.Where(x=>coll1.Any(y=>x==y));
    

    【讨论】:

    • 这对我来说似乎是最好的解决方案。 +1
    • 这不会按预期工作:如果 col2 = {1,2,3,4}, col1 = {2,2,4}。这将返回 {2,4} 而结果应该是 {2,2,4}?
    • @KingKing 很好的观察王..谢谢指出..更正了答案..:)
    • @Anirudh:它对我有用:coll3 = coll2.Where(x =&gt; coll1.Any(y =&gt; x == y)).ToList(); .. +1 仍然。
    【解决方案2】:
    coll3 = coll1.Where(i => coll2.Contains(i)).ToList();
    

    更新。稍微简单一点,如 cmets 中所建议的:

    coll3 = coll1.Where(coll2.Contains).ToList();
    

    【讨论】:

    • 您可以将其简化为:var coll3 = coll1.Where(coll2.Contains).ToList();
    【解决方案3】:

    作为第一步,您可以使用where 子句使您的代码更具可读性:

        var coll1 = new List<int>() { 1, 2, 3, 4, 5 };
        var coll2 = new List<int>() { 2, 4 };
        var coll3 = new List<int>();
        foreach (var selected in coll2)
        {
            coll3.AddRange(coll1.Where(item => selected == item));
        }
    

    【讨论】:

      【解决方案4】:

      使用相交:http://msdn.microsoft.com/en-us/library/bb460136.aspx

      var coll3 = coll1.Intersect(coll2)
      

      【讨论】:

      • 它没有按预期工作(参见 King King 对 Anirudh 的回答的评论)。
      【解决方案5】:

      你可以这样做;不知道它是否更具可读性!

      var coll3 = (from selected in coll2
                      from item in coll1
                      where selected == item
                      select item).ToList();
      

      【讨论】:

      • 这也正是 resharper 的建议。
      • 我想知道反对票。这段代码是正确的,为什么?虽然看起来有些笨蛋刚刚对这里的所有答案投了反对票……
      • @Matthew Watson:谁投了反对票?奇怪的。我确定我会给你 +1 :-)
      【解决方案6】:

      如果您不想直接将结果分配给您的列表,您可以将“ForEach”添加到您的 Linq 语句中:

      coll1.Where(i => coll2.Contains(i)).ToList().ForEach(i => coll3.Add(i));
      

      您可能需要检查 Distinct

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-13
        • 2017-02-19
        • 1970-01-01
        • 2023-03-22
        • 2016-08-07
        相关资源
        最近更新 更多