4

これで、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;

これは、これまでに見つけた最良の解決策です。誰かがもっときちんとした解決策を持っているなら、私はそれを見たいです。

4

3 に答える 3

30

代わりにこれを試してください:

 for I := ObjectList.Count - 1 downto 0 do
   if TMyClass(ObjectList[I]).ShouldRemove then
     ObjectList.Delete(I);

これは goto の特に悪い使い方のように見えます。そのように for ループから飛び出します。私はそれがうまくいくと思います(あなたがそれを使っているので)が、それは私にウィリーを与えるでしょう.

于 2010-10-17T00:51:41.443 に答える
7

使用することもできます

  I := 0;
  while I < ObjectList.Count do begin
    if TMyClass(ObjectList[I]).ShouldRemove then ObjectList.Delete(I)
    else Inc(I);
  end;
于 2010-10-17T01:24:37.887 に答える
0

私が見た Goto の有効な使用法は、Delphi のヘルプで提供されているものだけです。

for I := 0 to something do
begin
  for J := 0 to something do
  begin
    For K := 0 to something do
    begin
      if SomeCondition then
        Goto NestedBreak
    end;
  end;
end;
NestedBreak:

たとえば、ローカル関数でループを移動し、EXIT を使用することで、その例では Goto を回避できます。サブ機能が受け入れられない場合でも、それを行うことができます。

for I := 0 to something do
begin
  for J := 0 to something do
  begin
    For K := 0 to something do
    begin
      if SomeCondition then
      begin
        GottaBreak := True
        Break;
      end; 
    end;
    if GottaBreak then Break;
  end;
  if GottaBreak then Break;
end;

これは最適ではありません。

Goto が最善の解決策になる他の状況をまだ 1 つも見ていません。

後藤自体は悪くない。EXIT、BREAK、CONTINUE と同じフロー制御コマンドです。他のものは特定の状況に制限され、コンパイラによって正しく管理されることを除いて。(そうは言っても、私が話した一部のプログラマーは、それらを Goto と同じくらい有害であると考えていますが、私は共有しません) Goto は制限がないため、Goto でできることは非常にマイナスの影響を与える可能性があります。とにかく、私はすでに質問の範囲を少し超えていたと思います。^_^

于 2010-10-17T01:06:34.103 に答える