4

(请参阅下面的代码片段)我想找到与 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);
                }
            }
        }
4

6 回答 6

14

您可以使用相交

coll1.Intersect(coll2);

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

coll2.Where(x=>coll1.Any(y=>x==y));
于 2013-07-26T09:29:24.263 回答
6
coll3 = coll1.Where(i => coll2.Contains(i)).ToList();

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

coll3 = coll1.Where(coll2.Contains).ToList();
于 2013-07-26T09:28:12.137 回答
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));
    }
于 2013-07-26T09:28:50.310 回答
2

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

var coll3 = coll1.Intersect(coll2)
于 2013-07-26T09:30:00.870 回答
1

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

var coll3 = (from selected in coll2
                from item in coll1
                where selected == item
                select item).ToList();
于 2013-07-26T09:27:37.893 回答
0

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

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

不过,您可能想检查 Distinct

于 2013-07-26T09:35:25.627 回答