我一直在创建一个系统,用于存储持续指定持续时间的对象,然后自行删除。但是,我在查找如何在for循环运行时从数组中删除过期的项目时遇到了一些麻烦(以最大限度地减少数组中的额外迭代)
这是我到目前为止所做的。列表中的术语标有一个布尔值,表示它们已完成。
For i = 0 To VisualEffects.Count - 1 Step 1
VisualEffects(i).Update(gt)
VisualEffects(i).Draw(sb, Pos, Cam)
If VisualEffects(i).CD.isExpired() Then
VisualEffects.RemoveAt(i)
i = -1
End If
Next
Next
为什么会产生错误?如何从数组中删除一个术语,继续迭代循环的其余部分?
此致
战神
答案 0 :(得分:2)
该行
i = -1
将i
设置为-1,导致For
循环终止。
如果可以,请颠倒循环的顺序,以便从最后一个数组元素开始并倒计时。这使得删除逻辑变得更加直接。
答案 1 :(得分:2)
.NET数组是固定大小的,因此您根本无法从数组中删除元素。您可以更改元素的值,因此可以将元素设置为Nothing以删除它引用的对象,但元素仍然存在。如果您阅读了Array类的MSDN文档,那么您将看到RemoveAt方法因此而抛出NotSupportedException。
如果您实际上使用的是集合而不是数组,那么您可以调用RemoveAt但是您需要从最后一个索引循环到第一个索引而不是从头到尾循环。这样,删除项目不会影响您尚未访问的项目的索引。