使用linq& amp;来简化传统的foreach嵌套循环。 lambda表达式

时间:2013-07-26 09:25:36

标签: c# linq lambda nested-loops

(参见下面的代码片段)我想找到与coll2项目匹配的coll1的所有项目(coll2的项目数< = coll1的项目数),并将查询结果放在coll3中。如何使用linq和lambda表达式实现它? 当然,我可以简单地将coll2复制到coll3 :-)但这不是我的目标。我想知道使用linq和lambda来代替这种传统逻辑结构的方法。提前谢谢。

        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);
                }
            }
        }

6 个答案:

答案 0 :(得分:14)

您可以使用Intersect

coll1.Intersect(coll2);

但是这不会像预期的那样起作用(参见金王的评论)..你可以这样做

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

答案 1 :(得分:6)

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

更新。稍微简单一点,如评论中所示:

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

答案 2 :(得分:2)

作为第一步,您可以使用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));
    }

答案 3 :(得分:2)

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

var coll3 = coll1.Intersect(coll2)

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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

您可能需要检查“区别”