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

8

我有一个包含一些对象的列表,想使用LINQ来删除特定的项目,但不确定如何做到这一点。

foreach (var someobject in objectList)
{
    if (someobject.Number == 1) // There will only one item where Number == 1.  
    {
        list.remove(someobject)
    } 
}

2
那么,你的代码不工作了吗? - Vsevolod Goloviznin
与您所声称的相反,您当前的代码根本没有涉及LINQ。您是否有想要/需要基于LINQ的解决方案的具体原因?或者任何其他高效的解决方案也可以接受吗? - stakx - no longer contributing
1
@VsevolodGoloviznin:上面的代码不可能正常工作,因为它包含语法错误——list.remove(someobject) - stakx - no longer contributing
“list”和“objectList”是什么?它们是相同的变量还是有区别?当前代码有什么问题? - Sriram Sakthivel
@stakx 嗯,是的,我认为那只是一个打字错误,不管怎样如果是这样的话代码应该可以工作,尽管它不是最优的。 - Vsevolod Goloviznin
这个回答是否解决了您的问题?使用LINQ从List<T>中移除元素 - Michael Freidgeim
4个回答

29

在枚举过程中,您不能使用foreach来删除项目,否则会在运行时出现异常。

您可以使用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及更高版本中在枚举期间修改集合。不,您不能这样做。仅适用于新的并发集合


2
在这种情况下,您实际上可以使用foreach,因为只有一个要删除的项。只需确保在删除该项后使用break退出循环,否则您将在下一次迭代中遇到异常。话虽如此,我认为使用RemoveAll()的解决方案更加优雅。 - haagel

4

使用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,就像Tim Schmelter所展示的那样。


正如其他地方指出的那样,如果在找到匹配项后你愿意使用 break,那么没有理由将 foreach 循环转换为 for 循环。 - Rawling
1
@Rawling,另一个人添加了break语句。无论如何,一开始的答案也不好。 - mybirthname

2

您可以使用 foreach 循环从列表中删除项。重要的是要使用 break 来在删除项后停止循环。如果循环在从列表中删除项后继续进行,将抛出异常。

foreach (var someobject in objectList)
{
    if (someobject.Number == 1) // There will only one item where Number == 1
    {
        objectList.remove(someobject);
        break;
    } 
}

然而,这只有在您只想删除一个对象的情况下才有效,就像您的情况一样。


-1

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

for (int i=0; i < objectList.Count; i ++)
{
    if (objectList[i].Number == 1) // there will only one item with Number = 1   
    {
       objectList.RemoveAt[i];
    } 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接