C# LINQ从ILST中删除某些元素<;T>;基于IList<;int>;
如何使用LINQ从基于另一个IList的IList中删除某些元素。 我需要从列表1中删除记录,其中ID存在于列表2中。 下面是代码示例C# LINQ从ILST中删除某些元素<;T>;基于IList<;int>;,c#,linq,ilist,C#,Linq,Ilist,如何使用LINQ从基于另一个IList的IList中删除某些元素。 我需要从列表1中删除记录,其中ID存在于列表2中。 下面是代码示例 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).Fi
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);
}
classdto
{
Prop int ID,
道具字符串名称
}
IList列表1;
IList列表2;
foreach(列表2中的变量i)
{
var matchingRecord=list1.Where(x.ID==i.First();
列表1.删除(匹配记录);
}
我就是这样做的,有没有更好的方法可以做到这一点。您可以使用
Where
来简化:
list1 = list1.Where(x => !list2.Contains(x.ID))
.ToList();
但您确实需要在适当的位置删除,更喜欢@DanielHilgarth的答案我会使用这种方法:
var itemsToRemove = list1.Where(x => list2.Contains(x.ID)).ToList();
foreach(var itemToRemove in itemsToRemove)
list1.Remove(itemToRemove);
这种方法将项目移除到位。它最适用于list1
中有许多项,而list2
中只有很少项的情况如果
list1
和list2
中的项目数量相似,那么Cuong Le的方法是一个很好的选择。您可以为IList
编写一个“RemoveAll()”扩展方法,其工作原理与List.RemoveAll()
完全相同。(这通常非常有用,可以保存在公共类库中。)
例如(为了清晰起见,删除了错误检查;您需要检查参数是否不为null):
没有一天会有类似的问题。不要用Linq来回答这个问题。Linq是关于筛选和创建新序列,而不是修改集合的。RemoveAll不返回列表,它返回一个表示已删除项目数的整数。@RobertJ.:已编辑myanswer@RobertJ. 你应该使用RemoveAll,看看我的答案。事实上,他之前的答案中有我的评论。没关系,这是一个IList为什么在
Where
之后做ToList()
?“不要认为这是必要的。”乔治·达克特:是的,这是必要的。否则,itemsToRemove
将迭代list1
。与删除
一起,这将产生一个无效操作异常
:集合被修改;枚举操作可能无法执行ah,很好的一点,忘记了这一点。
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.RemoveAll(item => list2.Contains(item.ID));