【问题标题】:How to Remove multiple items in List using RemoveAll on condition?如何在条件下使用 RemoveAll 删除列表中的多个项目?
【发布时间】:2015-10-09 12:53:14
【问题描述】:

我尝试如下。

MyList.RemoveAll(t => t.Name == "ABS");
MyList.RemoveAll(t => t.Name == "XYZ");
MyList.RemoveAll(t => t.Name == "APO");

相反,我该怎么做:

MyList.RemoveAll(t => t.Name == "ABS" || t => t.Name == "XYZ" ||t => t.Name == "APO");

【问题讨论】:

  • 这与 LINQ to SQL 有什么关系?你用的是List<T>,大概……

标签: c# linq linq-to-sql


【解决方案1】:

您只需要 一个 lambda 表达式 - || 在其中:

MyList.RemoveAll(t => t.Name == "ABS" || t.Name == "XYZ" || t.Name == "APO");

换句话说,“给定一个t,如果t.Name 是ABS,或者t.Name 是XYZ,或者t.Name 是APO,我想删除该元素。”

那里只有一个“给定一个t”,这就是t => 部分的实际含义。

【讨论】:

    【解决方案2】:

    一个更可扩展的方法是有一个列表来说明要删除的内容

    List<T> toRemove = ...
    MyList.RemoveAll(t =>  toRemove.Contains(t.Name));
    

    在你的例子中 T 是一个字符串

    【讨论】:

      【解决方案3】:

      var nameToRemove = new[]{"ABS", "XYZ", "APO"};
      MyList.RemoveAll(t => nameToRemove.Contains(t.Name))
      

      【讨论】:

      • 你真的想在每次迭代时构造一个新数组吗?
      • @JonSkeet:您能否在每次迭代中扩展您对新数组的评论?你的意思是它遍历MyList 来执行RemoveAll,并且为MyList 中的每个元素创建nameToRemove 数组的新副本?
      • @SimonTewsi:我强烈怀疑帖子最初有 MyList.RemoveAll(t =&gt; new[]{"ABS", "XYZ", "APO"}.Contains(t.Name)),并且作者在 5 分钟宽限期内修复了它,不会留下编辑历史记录。
      【解决方案4】:

      如果在任何时候都不需要列表中有多个项目,您应该考虑使用HashSet 而不是List

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        • 2018-12-10
        • 2020-01-20
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        • 1970-01-01
        相关资源
        最近更新 更多