(参见下面的代码片段)我想找到与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);
}
}
}
答案 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));
您可能需要检查“区别”