好的,所以你有一个 TObjectList 实例。您想遍历其中的项目并从列表中删除一些对象。你不能这样做:
for I := 0 to ObjectList.Count - 1 do
if TMyClass(ObjectList[I]).ShouldRemove then
ObjectList.Delete(I);
...因为一旦你删除了第一个对象,索引计数器就会出错,循环将不再起作用。
所以这是我的解决方案:
Again:
for I := 0 to ObjectList.Count - 1 do
if TMyClass(ObjectList[I]).ShouldRemove then
begin
ObjectList.Delete(I);
goto Again;
end;
这是迄今为止我找到的最好的解决方案。如果有人有更简洁的解决方案,我很乐意看到它。
最佳答案
试试这个:
for I := ObjectList.Count - 1 downto 0 do
if TMyClass(ObjectList[I]).ShouldRemove then
ObjectList.Delete(I);
这看起来像是对 goto 的一个特别糟糕的使用,像那样跳出 for 循环。我认为它有效(因为你正在使用它),但它会给我威利。
关于Delphi:在这种情况下,Goto不会被认为有害吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3951487/