好的,所以你有一个 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/

10-10 12:26