我试图学习linq,但在努力学习一些概念。我如何将这个双foreach循环转换为linq查询?
foreach (var l1 in list1)
{
foreach (var l2 in list2)
{
if (l1 == l2)
{
list1.Remove(l1);
}
}
}
答案 0 :(得分:7)
var list3 = list1.Except(list2);
LINQ不会改变列表。
答案 1 :(得分:3)
如果list1
被声明为List<T>
,那么您可以执行此操作:
list1.RemoveAll(list2.Contains);
您可能会发现有点难以阅读。以上基本上相当于:
list1.RemoveAll(item1 => list2.Contains(item1));
请注意,此解决方案不基于LINQ。但是,如果list2
的类型没有Contains
方法,那么LINQ可以帮助您使用.Contains
扩展方法;在这种情况下,在代码中添加using System.Linq;
指令。)
PS:请确保您已阅读并理解my above comment:LINQ的目的是查询数据,而不是修改数据。 < / p>
答案 2 :(得分:0)
有很多方法可以做到,一个例子就是使用Intersect
:
var inBothLists = list1.Intersect(list2);
inBothLists.ToList().ForEach(i => list1.Remove(i));
答案 3 :(得分:0)
Linq用于查询,而不是更新,但您可以查询需要删除的项目,然后将其删除:
var itemsToRemove = list1.Where(l2.Contains(l1));
foreach(var item in itemsToRemove)
{
list1.Remove(item)
}