C# 使用LINQ从列表中删除特定项
我有一个包含一些对象的列表,希望使用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) } } 在枚举过程中,您将在运行时得到一个异常 您可以使用: 或者,如果它实际上不是一
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;
}
}