2012-03-06 3 views
1

私は内側のループから脱出する必要があり、出口ループはそうする最良の方法ではないことを知らされています。だから私はそうするための別の方法を考えた、私はifステートメント内の値を取得したいが、それは正しく動作するように見えません。これは内部のループから壊れてはいけませんか?

While Bavailable = True 

      For Each position In MyPosList 

       If creditPoints = "20" And semester = "1" And year = "Year 1" Then 
        Blongthin = False 
        BlongFat = False 
        If position.strLabel = "a1" And available(0) = "True" Then 

         pos = position.strX & " " & position.strY 
         count += 1 
         available(0) = blnavailable 
         Bavailable = False 
         MsgBox(Bavailable) 

        ElseIf position.strLabel = "b1" And available(1) <> "False" Then 
         pos = position.strX & " " & position.strY 
         'position.blnAvail = False 
         count += 1 
         available(1) = blnavailable 
         Bavailable = False 

        ElseIf position.strLabel = "c1" And available(2) <> "False" Then 
         pos = position.strX & " " & position.strY 
         position.blnAvail = False 
         count += 1 
         available(2) = blnavailable 
         Bavailable = False 
        End If 

私は条件が真を返しているのならば、これらのいずれかのインスタンスに値POSを取得しようとループから抜け出すためにBavailableを使用していることがわかり?どんな助け?

+0

ハンガリータイプの表記? – asawyer

答えて

0

すべての項目をループしたくないときにForループを使用するのは嫌です。このような状況では、私はWhileを使うほうが好きです。どのようなものについて:

Dim index As Integer 
index = 0 

While Not Found And index < MyPosList.Count 
    ' Do whatever and update Found when required 
    index = index + 1 
While End 
0

試してみてください。

While Bavailable 
     For Each position In MyPosList 
      If Bavailable Then 'Add loop controls to inner loop 
       If creditPoints = "20" And semester = "1" And Year() = "Year 1" Then 
        Blongthin = False 
        BlongFat = False 
        If position.strLabel = "a1" And available(0) = "True" Then 
         pos = position.strX & " " & position.strY 
         count += 1 
         available(0) = blnavailable 
         Bavailable = False 
         MsgBox(Bavailable) 

        ElseIf position.strLabel = "b1" And available(1) <> "False" Then 
         pos = position.strX & " " & position.strY 
         'position.blnAvail = False 
         count += 1 
         available(1) = blnavailable 
         Bavailable = False 

        ElseIf position.strLabel = "c1" And available(2) <> "False" Then 
         pos = position.strX & " " & position.strY 
         position.blnAvail = False 
         count += 1 
         available(2) = blnavailable 
         Bavailable = False 
        End If 
       End If 
      End If 
     Next position 
    End While 

私は正確にExit ForExit Whileについて間違っているものに非常に興味がありますが...

+0

構造化プログラミングの概念を打破しました。 Exit、Exit While、およびGotoステートメントの違いは何ですか? –

+0

私は、「Goto」が悪いことに同意します。そのため、私は1984年に(完全に)使用を中止しました。しかし、 'Exit'ステートメントと' Goto'ステートメントにはかなりの違いがあります。 'Exit'ステートメント(For、Whileなど)は、ループをクリーンな方法で終了し、プログラム制御はループの次のステートメントで再開します。 'Goto'文はコードベースの任意の行にジャンプします。 'Exit'文は構造化プログラミングの概念を破るものではありません**。彼らは、実際には意図的に**構造化プログラミングの概念を維持するのに役立つ言語で書かれています。 – pete

+0

IMHOの意見では、メソッドには1つのエントリポイントと1つの終了ポイントが必要です。他のショートカットは、メソッドの実際のロジックを隠し、その構造を破ります。 –

0

Exit ForまたはExit While場合は、あなたのコードをより作ります読める、それらを使用する! 目的が不必要な複雑さを追加するだけの変数を追加する意味がありません。

ほとんどの内部ロジックを別々の機能に移行することができます。

+0

完全に同意します。私のコメントをpeteの答えで読んでください。もちろん、あなたのコードを読みやすくするものは何でも構いません。しかし、実行フローを壊すステートメントは、コードを読みやすくしません。 –

+0

return文は同じことをします。実行の流れを破ります(あなたが最大限に制限されていない限り、最後の行として関数ごとに1つの戻り値)。 – Michael

+0

これは私がいつもやっていることです。私のメソッドは、常に1つのエントリポイントと1つの出口ポイントを持っています。それは構造化されたプログラムのIMHOです。 –

1

私は前提に同意しません。その外側whileループを使用している理由がExit Forを使用しないようにするには、Whileを削除する必要があります。 Forの中のあなたの条件が本当に本当に長く、あなたがスポーツよりも飛び跳ねるのを避けたいなら、これをやってください:

For Each position In MyPosList 

    Dim breakEarly As Boolean = False 

    If someCondition Then 

     'logic, logic, logic 
     'logic, logic, logic 
     'logic, logic, logic 
     breakEarly = True 

    ElseIf someOtherCondition Then 

     'logic, logic, logic 
     'logic, logic, logic 
     'logic, logic, logic 
     breakEarly = True 

    ElseIf etc, 
    ElseIf etc, 
    ElseIf etc, 
    End If 

    If breakEarly Then 

     'do any common pre-exit code here 

     'now bail 
     Exit For 

    End If 

Next 
+0

私は同意しません。コレクションの一部だけを処理したい場合はWhileを使います。コレクション全体を処理したい場合は、を使用します。 –

+0

@somos Ack、間違った投稿、愚かな電話にコメントしました。上記の私のメモを参照してください。さらに、foreachは、インデックス変数を使用することが賢明でない場合、多くの状況でコードを読みやすくします。たとえば、foreachはリンクリストのインデックスベースの反復処理よりも大幅に優れています – tcarvin

関連する問題