【问题标题】:How to remove negative values from a List<int>?如何从 List<int> 中删除负值?
【发布时间】:2012-06-07 04:39:16
【问题描述】:

我的列表中有一堆整数(名为“listInts”)。

这不应该让任何人感到惊讶。

我的问题是我不想要任何负数,但有可能有三个,特别是 -1、-2 和 -3。

我可以通过以下方式笨拙地删除它们:

if (listInts.Contains(-1) {
    int i = listInts.IndexOf(-1);
    listInts.Remove(i);
    // etc.
}

...但我知道这散发出的代码气味比一大群鸡貂还要臭。

有什么更好的方法?

【问题讨论】:

    标签: c# algorithm generics arraylist


    【解决方案1】:
    listInts.RemoveAll(t => t < 0)
    

    【讨论】:

      【解决方案2】:

      我会使用 LINQ:

      listInts = listInts.Where(i => i >= 0).ToList();
      

      根据这将如何使用,您还可以避免 ToList() 调用并且不重新保存值:

      var positiveInts = listInts.Where(i => i >= 0);
      

      这仍然可以让您根据需要进行枚举。

      如果需要原地更改列表,List&lt;T&gt;.RemoveAll其实是更高效的方法:

      listInts.RemoveAll(i => i < 0);
      

      但是,我不喜欢这种方法,因为它会导致副作用,并且如果您使用其他 LINQ 扩展方法,往往会造成混淆(因此妨碍维护)。

      【讨论】:

      • 虽然 .RemoveAll 会更好,因为它是作为列表方法实现的,并且会在列表本身上执行操作,而不是创建一个新的。
      • @YoryeNathan 我编辑提到了这一点,包括为什么我更喜欢这个而不是 RemoveAll
      • 这会让不知道的人感到困惑。我希望编码人员在尝试维护之前了解编码。效率+评论=胜利。
      • @YoryeNathan 我实际上更喜欢我的第二个选项 - 这通常比任何一个都更有效。但是,可维护性的副作用还包括将您锁定在 List&lt;T&gt; 中以进行原始实现。如果稍后您更改集合,RemoveAll 将突然变成编译器错误...使用 LINQ 可以让您更灵活。 (我也绝不会推荐 RemoveAll 方法;))
      • 我同意通常使用 IEnumerable 是一个明智的选择,但如果我已经将变量作为列表,我将使用 RemoveAll 方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 2016-07-02
      • 2012-09-28
      • 2015-09-22
      • 2018-04-27
      • 1970-01-01
      • 2020-02-22
      相关资源
      最近更新 更多