使用 LINQ 从列表中删除特定项目

Posted

技术标签:

【中文标题】使用 LINQ 从列表中删除特定项目【英文标题】:Remove a specific item from a list using LINQ 【发布时间】:2014-11-28 20:10:09 【问题描述】:

我有一个包含一些对象的列表,并想使用 LINQ 删除特定项目,但不知道该怎么做。

foreach (var someobject in objectList)

    if (someobject.Number == 1) // There will only one item where Number == 1.  
    
        list.remove(someobject)
     

【问题讨论】:

那么,你的代码不起作用还是什么? 与您声称的相反,您当前的代码根本不涉及 LINQ。您是否有特定的理由想要/需要基于 LINQ 的解决方案?或者任何其他有效的解决方案也可以接受? @VsevolodGoloviznin:上面的代码不可能工作,因为它包含语法错误——list.remove(someobject) 什么是listobjectList?它们都是相同的变量还是什么?而目前的代码有什么问题? @stakx 好吧,是的,我虽然这只是一个错字,但无论如何如果它是代码应该可以工作,虽然它不是最佳的 【参考方案1】:

您在枚举期间cannot use a foreach to remove items,在运行时遇到异常。

你可以使用List.RemoveAll:

list.RemoveAll(x => x.Number == 1);

或者,如果它实际上不是 List<T> 而是任何序列,则 LINQ:

list = list.Where(x => x.Number != 1).ToList();

如果您确定只有一个具有该编号的项目,或者您想最多删除一个项目,您可以使用另一个答案中建议的 for 循环方法或这样:

var item = list.FirstOrDefault(x => x.Number == 1);
if(item ! = null) list.Remove(item);

我发布的另一个问题的链接表明您可以在 C# 4 及更高版本的枚举期间修改集合。不,你不能。 That applies only to the new concurrent collections。

【讨论】:

在这种情况下,您实际上可以使用 foreach,因为只有一个要删除的项目。只需确保在删除项目后使用 break 退出循环,否则您将在下一次迭代时遇到异常。也就是说,我认为 RemoveAll() 的解决方案更优雅。【参考方案2】:

您不能使用 foreach 从集合中删除项目。这将抛出集合被修改的异常。

你可以用 for 来执行它

for (int i=objectList.Count-1; i>=0 ; i--)

    if (objectList[i].Number == 1) // there will only one item with Number = 1   
    
       objectList.Remove(objectList[i]);
     

其他情况是使用Remove/RemoveAll like Tim Schmelter show。

【讨论】:

正如在别处指出的那样,如果您在找到匹配项后乐于使用break,则没有理由将foreach 循环切换为for 循环。 @Rawling 其他人添加了 break 语句。反正一开始的答案也不好。【参考方案3】:

您可以使用 foreach 循环从列表中删除项目。重要的是一旦您删除了项目,使用 break 来停止循环。如果从列表中删除一个项目后循环继续,则会引发异常。

foreach (var someobject in objectList)

    if (someobject.Number == 1) // There will only one item where Number == 1
    
        objectList.remove(someobject);
        break;
     

但是,这仅在您只想删除一个对象时才有效,就像您的情况一样。

【讨论】:

【参考方案4】:

如果值符合条件,您可以在索引处删除

for (int i=0; i < objectList.Count; i ++)

    if (objectList[i].Number == 1) // there will only one item with Number = 1   
    
       objectList.RemoveAt[i];
     

【讨论】:

以上是关于使用 LINQ 从列表中删除特定项目的主要内容,如果未能解决你的问题,请参考以下文章

如何根据多个条件并使用 linq 从通用列表中删除项目

使用 LINQ 删除列表中的项目 [重复]

在列表视图项目中使用折叠不会完全删除特定项目视图的空间

从列表中删除特定项目范围

从 C 中的双向链接列表中删除特定项目

从Python列表中的特定位置删除项目[重复]