使用 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)
。
什么是list
和objectList
?它们都是相同的变量还是什么?而目前的代码有什么问题?
@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 从列表中删除特定项目的主要内容,如果未能解决你的问题,请参考以下文章