Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ从ILST中删除某些元素<;T>;基于IList<;int>;_C#_Linq_Ilist - Fatal编程技术网

C# LINQ从ILST中删除某些元素<;T>;基于IList<;int>;

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

如何使用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).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));