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

C# 使用LINQ从列表中删除特定项,c#,linq,C#,Linq,我有一个包含一些对象的列表,希望使用LINQ删除一个特定的项目,但不确定如何执行 foreach (var someobject in objectList) { if (someobject.Number == 1) // There will only one item where Number == 1. { list.remove(someobject) } } 在枚举过程中,您将在运行时得到一个异常 您可以使用: 或者,如果它实际上不是一

我有一个包含一些对象的列表,希望使用LINQ删除一个特定的项目,但不确定如何执行

foreach (var someobject in objectList)
{
    if (someobject.Number == 1) // There will only one item where Number == 1.  
    {
        list.remove(someobject)
    } 
}
在枚举过程中,您将在运行时得到一个异常

您可以使用:

或者,如果它实际上不是一个
列表
,而是任何序列,LINQ:

list = list.Where(x => x.Number != 1).ToList();
如果您确定只有一个项目具有该编号,或者您希望最多删除一个项目,则可以使用其他答案中建议的for-loop方法,或者:

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

我发布的另一个问题的链接建议您可以在C#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
show。如果值符合标准,则可以在索引处删除

for (int i=0; i < objectList.Count; i ++)
{
    if (objectList[i].Number == 1) // there will only one item with Number = 1   
    {
       objectList.RemoveAt[i];
    } 
}
for(int i=0;i
您可以使用foreach循环从列表中删除项目。重要的是,一旦删除了该项,就使用break停止循环。如果从列表中删除某个项后循环继续,将引发异常

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

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

那么,您的代码不起作用还是什么?与您所声称的相反,您当前的代码根本不涉及LINQ。您是否有想要/需要基于LINQ的解决方案的具体原因?或者其他有效的解决方案也可以接受吗?@VsevolodGoloviznin:上述代码不可能工作,因为它包含语法错误–
list.remove(someobject)
。什么是
list
objectList
?它们都是相同的变量还是什么?那么当前的代码有什么问题?@stakx是的,我认为这只是一个输入错误,不管怎样,如果它是正确的,那么代码应该可以工作,尽管它不是最佳的。在这种情况下,您实际上可以使用foreach,因为只有一项要删除。只要确保在项目被移除后使用break退出循环,否则在下一次迭代中会出现异常。也就是说,我认为使用RemoveAll()的解决方案更为优雅。正如其他地方指出的,如果您在找到匹配项后愿意
中断
,则没有理由将
foreach
循环切换为
for
循环。@Rawling其他人添加了break语句。无论如何,一开始的答案也不好。
foreach (var someobject in objectList)
{
    if (someobject.Number == 1) // There will only one item where Number == 1
    {
        objectList.remove(someobject);
        break;
    } 
}