【问题标题】:Remove a specific item from a list using LINQ使用 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 好吧,是的,我虽然这只是一个错字,但无论如何如果它是代码应该可以工作,虽然它不是最佳的

标签: c# linq


【解决方案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];
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2019-03-17
      • 2018-05-03
      • 1970-01-01
      相关资源
      最近更新 更多