【发布时间】:2016-11-21 15:38:17
【问题描述】:
在某些代码中,我使用 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 工作正常,因为它以正确的顺序迭代并且到目前为止没有遇到任何错误。
这种 hack 的一个缺点是代码的可维护性/可读性,因为它不是这种方法的原始目的,以后可能会引起混乱。
所以我的问题是:这种 hack 是否还有其他缺点(性能、可能的错误……)?
【问题讨论】:
-
您在此处需要更好的性能吗?您是否在代码中发现了证明“黑客”合理的性能问题?
-
你写的O(2n)是什么意思?
-
这不是你说的“黑客”吗?也以这种方式看到并使用它与其他东西
-
如果您依赖保留顺序,请不要使用它。没有这样的保证。除此之外,这是风格问题——有人可能不在乎,有人可能想把你的四肢和身体分开。忘记算法的复杂性——你也不能保证,因为
RemoveAll方法(或ForEach)的实现不是合同的一部分。无论如何,在所有更新之后推迟删除可能会更好地为您服务 - 否则当对象依赖于其他对象并且您以未指定的顺序删除它们时,您会获得很多乐趣。 -
@Tr1et 但是 O(2n) == O(n)。