使用List <t> .RemoveAll和ForEach一样有什么缺点?

时间:2016-11-21 15:38:17

标签: c# list foreach

在某些代码中,我使用List<T>.RemoveAll作为特殊List<T>.ForEach,允许动态删除元素,因为我认为它会提供更好的性能: O(n)使用RemoveAll O(2n)中的一个组合循环,其中一个ForEach和一个RemoveAll

示例:

gameObjects.RemoveAll( object => {
    if (object.Active){
        // Doing stuffs on object
    }
    return !object.Active;
});

至少在我的代码中,这个hack有效,因为它以正确的顺序迭代并且到目前为止没有遇到任何错误。

这种黑客的一个缺点是代码可维护性/可读性,因为它不是这种方法的原始目的,可能会在以后引起混淆。

所以我的问题是:这个黑客有其他缺点(性能,可能的错误......)?

3 个答案:

答案 0 :(得分:4)

在一次迭代中完成两倍的工作实际上并不是两次迭代的效率的两倍,每次迭代只做一半的工作。

哪个更快,在一英里长的赛道上做一圈,或在半英里长的赛道上做两圈呢?

通过尝试在一次迭代中完成所有这些操作,您不必要地使代码变得复杂,而您实际上并没有从中受益。只需拨打一次RemoveAll即可删除所有不活动的项目,然后foreach通过该集合对活动项目进行操作。

答案 1 :(得分:0)

我不是在暗示这是一个黑客,而是以特定方式使用设计元素。因为它似乎按照文档执行其工作。删除与指定谓词定义的条件匹配的所有元素。List.RemoveAll

  

...按照正确的顺序进行迭代,遇到没有   到目前为止的bug。

这里有两个步骤,一个用于对每个项目进行操作,第二个步骤是从列表中删除。使用此方法有效且可读。已经预先确定删除的事实是无关紧要的。

纯粹主义者会抱怨,但操作需要循环遍历这些项目,为什么不集中工作

  

代码可维护性/可读性

对于维护......只需将意图评论给任何未来的开发人员。

  

这种黑客有其他缺点(性能,可能的错误......)?

不,我会认为黑客有两个循环,而逻辑可以完成。

答案 2 :(得分:-1)

我在Stackoverflow上发现了这个: Stackoverflow - Maybe same 我想你的方法可行,我认为没问题,但正如你所说,有一天可能很难理解。我更喜欢“backloop”

这是上面链接中描述的另一种方式:正如智者所评论的那样,O(n * m)更慢 - 最坏的情况

NSData