如何使用LINQ从IList中删除基于另一个IList的某些元素。 我需要从list1中删除记录,其中ID存在于list2中。 下面是代码示例
class DTO
{
Prop int ID,
Prop string Name
}
IList<DTO> list1;
IList<int> list2;
foreach(var i in list2)
{
var matchingRecord = list1.Where(x.ID == i).First();
list1.Remove(matchingRecord);
}
我就是这样做的,有没有更好的方法来做同样的事情。
答案 0 :(得分:12)
我会用这种方法:
var itemsToRemove = list1.Where(x => list2.Contains(x.ID)).ToList();
foreach(var itemToRemove in itemsToRemove)
list1.Remove(itemToRemove);
此方法删除了适当的项目。最适用于list1
中有很多项目且list2
中很少项目的情况
如果list1
和list2
中的项目数量相似,那么Cuong Le的方法就是一个不错的选择。
答案 1 :(得分:11)
您可以为IList<T>
编写一个“RemoveAll()”扩展方法,其工作方式与List.RemoveAll()
完全相同。 (这通常足以保存在公共类库中。)
例如(为清楚起见,删除了错误检查;您需要检查参数是否为空):
public static class IListExt
{
public static int RemoveAll<T>(this IList<T> list, Predicate<T> match)
{
int count = 0;
for (int i = list.Count - 1; i >= 0; i--)
{
if (match(list[i]))
{
++count;
list.RemoveAt(i);
}
}
return count;
}
然后根据需要从list1中删除项目确实会变得如此简单:
list1.RemoveAll(item => list2.Contains(item.ID));
答案 2 :(得分:8)
您可以使用Where
更简单:
list1 = list1.Where(x => !list2.Contains(x.ID))
.ToList();
但你真的需要删除,更喜欢@ DanielHilgarth的回答