1

私は4つのエンティティを持っています」

ObjectA、ObjectB、ObjectC、ObjectD

foreach(ObjectA objectA in listObjectA)
if (relationAB)
  foreach(ObjectB objectB in listObjectB) 
  if (relationBC)   
    foreach(ObjectC objectC in listObjectC) 
    if (relationCD)   
      foreach(ObjectD objectD in listObjectD) 
        if (I found what I'm looking for)  
        Do something

ですから、探していたものが見つかったら、最初の行に移動し、最初の行に移動しますが、リストの2番目の要素に移動します。これどうやってするの?なんてこった?

後で編集:この質問はC#用です。

PS 4つのフォースを使用せずに、私がやろうとしていることを行うためのより良い方法を考えてもらえますか?

4

4 に答える 4

7

これは単なる「プログラミング言語」の質問なので、一般的な答えは、ループの名前付けに言語の機能を使用してから、「break」ステートメントに適切な名前を付けることです。

悲しいことに、C と C++ の現在のバージョンはそのようなことをサポートしていないと思いgotoます。これを回避する良い方法は、抜け出したいループを独自のサブルーチンに入れ、return終わったら の代わりに を実行することですbreak。それは、私がそれらの貧弱な言語で作業するときに通常行うことです。

修正された例は次のようになります。

void find_whatever (/* probably pass in the lists or objects to search for*/)
  foreach(ObjectA objectA in listObjectA)
    if (relationAB)
      foreach(ObjectB objectB in listObjectB) 
        if (relationBC)   
          foreach(ObjectC objectC in listObjectC) 
            if (relationCD)   
              foreach(ObjectD objectD in listObjectD) 
                if (I found what I'm looking for)  
                Do something
                return;

注: タグが「プログラミング言語」から「C#」に変更されました。それは質問に対して正しいことでしたが、多くの人がこの回答を気に入っていたので、私はそれに大きな変更を加えていません.

于 2010-12-22T14:38:58.190 に答える
3

言語にもよりますが、通常はブレーク ラベルを追加できます。ただし、これは避けて、次のことをお勧めします。

function main() {
    foreach (ObjectA a in listA) {
        if (relationAB) {
            processA(a)
        }
    }
}

function processA(ObjectA a) {
    foreach (b) {
        foreach (c) {
            foreach (d) {
                if (found) {
                    doSomething();
                    return;
                }
            }
        }
    }
}

ブレーク ラベルと goto を含むコードは読みにくい場合があります。関数に分割すると、読みやすくなり、(おそらく) 書きやすく、デバッグしやすくなります。

于 2010-12-22T14:39:03.590 に答える
1

最も簡単なオプションは、すべてを関数に入れて、returnステートメントの代わりにステートメントを使用するbreakことです。

于 2010-12-22T14:40:38.990 に答える
0

そのような場合に使用することをお勧めしますreturn

内部の一部をメソッドに入れfor、必要に応じてメソッドから戻るだけです。のチェーンよりもはるかに読みやすくなります

if (found) {
 break;
}

あなたのループの中に。

于 2010-12-22T14:41:15.140 に答える