【问题标题】:Better way to remove matched items from a list [duplicate]从列表中删除匹配项的更好方法[重复]
【发布时间】:2010-11-12 08:44:25
【问题描述】:

在c#中,当我想从列表中删除一些项目时,我会按照以下方式进行,

List<Item> itemsToBeRemoved = new List<Item>();
foreach(Item item in myList)
{
   if (IsMatching(item)) itemsToBeRemoved.Add(item);
}

foreach(Item item in itemsToBeRemoved)
{
   myList.Remove(item);
}

有没有更好的办法?

【问题讨论】:

  • 首选没有 LINQ 的 c# 2.0 中的解决方案。谢谢!

标签: c# list


【解决方案1】:

好吧,您可以调用完全符合您要求的方法。

myList.RemoveAll(IsMatching);

通常,使用完全符合您要求的方法“更好”,而不是自己重新发明。

【讨论】:

  • 显然我忽略了这个方法..谢谢!!
【解决方案2】:
foreach(Item singleItem in new List<Item>(allItems))
{
  if(IsMatching(singleItem))
     allItems.Remove(singleItem);
}

【讨论】:

  • 我可能是错的,但我认为您不能在使用 foreach 迭代数组时修改数组。
  • 他没有修改它。他制作了一个副本,正在对副本进行迭代,并正在修改原件。
  • 啊,原来如此。第一次没注意到。
【解决方案3】:
myList.RemoveAll(x=> IsMatching(x));

【讨论】:

  • 如果你愿意,你甚至不必使用 lambda。编译器会自动将“IsMatching”转换为 Predicate.
  • +1 但这不是 LINQ,这只是 List 上的方法。
  • 另外,你为什么说“如果你可以使用 LINQ”?这和 LINQ 有什么关系?
  • 对不起,当我用这个替换它时,我正在输入另一个版本的答案。忘记删除介绍了。
  • 按照他的例子,我认为你想要 myList,而不是 itemsToBeRemoved。不过,很好的答案,+1
【解决方案4】:

类似于 Jakers 所说的,假设您使用的是 .Net 3:

myList = myList.Where(item => !IsMatching(item)).ToList();

【讨论】:

    【解决方案5】:

    我以前做的是创建一个反向for循环:

    for (int i=myList.Count-1; i>=0; i--)
    {
      if (IsMatching(myList[i]))
        myList.RemoveAt(i);
    }
    

    但我相信还有更优雅的方式使用 LINQ。

    【讨论】:

    • 我也被否决了!什么鬼!
    【解决方案6】:

    这是使用 Linq 的一点改进。

    var itemsToRemove = myList.Where(item => IsMatching(item)).ToList();
    foreach(Item item in itemsToBeRemoved)
    {
       myList.Remove(item);
    }
    

    【讨论】:

      【解决方案7】:

      如何还原您的逻辑,添加不匹配的项目并仅使用结果集合?

      List<Item> itemsTaken = new List<Item>();
      foreach(Item item in myList)
      {
         if (!IsMatching(item)) itemsTaken.Add(item);
      }
      
      // use itemsTaken as if it were myList with items removed
      

      【讨论】:

      • 这取决于列表中要删除的项目数和要保留的项目数的比率。
      猜你喜欢
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2018-12-04
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多