在某些代码中,我使用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有效,因为它以正确的顺序迭代并且到目前为止没有遇到任何错误。
这种黑客的一个缺点是代码可维护性/可读性,因为它不是这种方法的原始目的,可能会在以后引起混淆。
所以我的问题是:这个黑客有其他缺点(性能,可能的错误......)?
答案 0 :(得分:4)
在一次迭代中完成两倍的工作实际上并不是两次迭代的效率的两倍,每次迭代只做一半的工作。
哪个更快,在一英里长的赛道上做一圈,或在半英里长的赛道上做两圈呢?
通过尝试在一次迭代中完成所有这些操作,您不必要地使代码变得复杂,而您实际上并没有从中受益。只需拨打一次RemoveAll
即可删除所有不活动的项目,然后foreach
通过该集合对活动项目进行操作。
答案 1 :(得分:0)
我不是在暗示这是一个黑客,而是以特定方式使用设计元素。因为它似乎按照文档执行其工作。删除与指定谓词定义的条件匹配的所有元素。(List.RemoveAll )
...按照正确的顺序进行迭代,遇到没有 到目前为止的bug。
这里有两个步骤,一个用于对每个项目进行操作,第二个步骤是从列表中删除。使用此方法有效且可读。已经预先确定删除的事实是无关紧要的。
纯粹主义者会抱怨,但操作需要循环遍历这些项目,为什么不集中工作。
代码可维护性/可读性
对于维护......只需将意图评论给任何未来的开发人员。
这种黑客有其他缺点(性能,可能的错误......)?
不,我会认为黑客有两个循环,而逻辑可以完成。
答案 2 :(得分:-1)
我在Stackoverflow上发现了这个: Stackoverflow - Maybe same 我想你的方法可行,我认为没问题,但正如你所说,有一天可能很难理解。我更喜欢“backloop”
这是上面链接中描述的另一种方式:正如智者所评论的那样,O(n * m)更慢 - 最坏的情况
NSData