C# 使用linq&;简化传统的foreach嵌套循环;lambda表达式
(参见下面的代码片段)我想找到与coll2项匹配的coll1的所有项(coll2项的数量您可以这样做;不确定它是否更可读C# 使用linq&;简化传统的foreach嵌套循环;lambda表达式,c#,linq,lambda,nested-loops,C#,Linq,Lambda,Nested Loops,(参见下面的代码片段)我想找到与coll2项匹配的coll1的所有项(coll2项的数量您可以这样做;不确定它是否更可读 var coll3 = (from selected in coll2 from item in coll1 where selected == item select item).ToList(); 更新。简单一点,如评论中所建议: coll3 = coll1.Where(co
var coll3 = (from selected in coll2
from item in coll1
where selected == item
select item).ToList();
更新。简单一点,如评论中所建议:
coll3 = coll1.Where(coll2.Contains).ToList();
作为第一步,您可以使用子句使代码更具可读性:
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));
}
var coll1=newlist(){1,2,3,4,5};
var coll2=新列表(){2,4};
var coll3=新列表();
foreach(coll2中选择的变量)
{
coll3.AddRange(coll1.Where(item=>selected==item));
}
您可以使用
但这不会像预期的那样起作用(见King的评论)…你可以这样做
coll2.Where(x=>coll1.Any(y=>x==y));
使用交集:
如果不想直接将结果分配给列表,可以将“ForEach”添加到Linq语句中:
coll1.Where(i => coll2.Contains(i)).ToList().ForEach(i => coll3.Add(i));
您可能希望检查不同的,但您可以将其简化为:
var coll3=coll1.Where(coll2.Contains).ToList();
这对我来说似乎是最好的解决方案。+1这不会像预期的那样工作:如果col2={1,2,3,4}
,col1={2,2,4}
,这将返回{2,4}
虽然结果应该是{2,2,4}
?@KingKing很好的观察王..感谢指出..纠正了答案:)@Anirudh:对我来说是这样的:coll3=coll2.Where(x=>coll1.Any(y=>x==y)).ToList()代码>+1.这也正是resharper提出的建议。我想知道否决票是怎么回事。这个代码是正确的,为什么?尽管看起来有人在这里否决了所有答案…@马修·沃森:谁否决了?奇怪。我肯定我给了你+1:-)它并没有像预期的那样工作(见国王对阿尼鲁德答案的评论)。
coll1.Intersect(coll2);
coll2.Where(x=>coll1.Any(y=>x==y));
var coll3 = coll1.Intersect(coll2)
coll1.Where(i => coll2.Contains(i)).ToList().ForEach(i => coll3.Add(i));