Szukaj…


W następnym

For ... Next pętla służy do powtarzania tej samej akcji przez skończoną liczbę razy. Instrukcje wewnątrz następnej pętli zostaną wykonane 11 razy. Za pierwszym razem, i będzie miał wartość 0, po raz drugi będzie miał wartość 1, po raz ostatni będzie miał wartość 10.

For i As Integer = 0 To 10
    'Execute the action
    Console.Writeline(i.ToString)
Next

Do parametryzacji pętli można użyć dowolnego wyrażenia liczb całkowitych. Dopuszczalne jest, ale nie wymagane, aby zmienna kontrolna (w tym przypadku i ) była również podawana po opcji Next . Dozwolone jest zadeklarowanie zmiennej kontrolnej z wyprzedzeniem, zamiast w instrukcji For .

Dim StartIndex As Integer = 3
Dim EndIndex As Integer = 7
Dim i As Integer

For i = StartIndex To EndIndex - 1
    'Execute the action
    Console.Writeline(i.ToString)
Next i

Zdolność do zdefiniowania początkowych i końcowych liczb całkowitych pozwala na tworzenie pętli, które bezpośrednio odwołują się do innych obiektów, takich jak:

For i = 0 to DataGridView1.Rows.Count - 1
    Console.Writeline(DataGridView1.Rows(i).Cells(0).Value.ToString)
Next

Spowodowałoby to następnie przejście przez każdy wiersz w DataGridView1 i wykonanie akcji zapisania wartości kolumny 1 w konsoli. (-1 jest, ponieważ pierwszy wiersz zliczonych wierszy będzie wynosił 1, a nie 0)

Możliwe jest również określenie, w jaki sposób zmienna sterująca musi zwiększać wartość.

For i As Integer = 1 To 10 Step 2
    Console.Writeline(i.ToString)
Next 

To daje:

1 3 5 7 9

Możliwe jest również zmniejszenie wartości zmiennej kontrolnej (odliczanie).

For i As Integer = 10 To 1 Step -1
    Console.Writeline(i.ToString)
Next

To daje:

10 9 8 7 6 5 4 3 2 1

Nie należy próbować używać (czytać lub aktualizować) zmiennej kontrolnej poza pętlą.

For Each ... Następna pętla do zapętlania kolekcji przedmiotów

Możesz użyć pętli For Each...Next do iteracji po dowolnym typie IEnumerable . Obejmuje to tablice, listy i wszystko inne, co może być typu IEnumerable lub zwraca IEnumerable.

Przykład zapętlenia właściwości Rows DataTable wygląda następująco:

For Each row As DataRow In DataTable1.Rows
    'Each time this loops, row will be the next item out of Rows
    'Here we print the first column's value from the row variable.
    Debug.Print(Row.Item(0))
Next 

Ważną rzeczą do zapamiętania jest to, że nie można modyfikować kolekcji w pętli For Each . Może to spowodować System.InvalidOperationException z komunikatem:

Kolekcja została zmodyfikowana; Operacja wyliczenia może nie zostać wykonana.

Podczas pętli do iteracji, gdy spełniony jest pewien warunek

Pętla While rozpoczyna się od oceny warunku. Jeśli to prawda, ciało pętli jest wykonywane. Po wykonaniu treści pętli warunek While jest ponownie oceniany w celu ustalenia, czy wykonać ponownie treść.

Dim iteration As Integer = 1
While iteration <= 10
  Console.Writeline(iteration.ToString() & " ")

  iteration += 1
End While

To daje:

1 2 3 4 5 6 7 8 9 10

Ostrzeżenie: Pętla While może prowadzić do nieskończonej pętli . Zastanów się, co by się stało, gdyby usunięto wiersz kodu zwiększającego iteration . W takim przypadku warunek nigdy nie byłby prawdziwy, a pętla trwałaby w nieskończoność.

Do ... Loop

Użyj opcji Do...Loop aby powtórzyć blok instrukcji While lub do Until spełnienia warunku, sprawdzanie warunku na początku lub na końcu pętli.

Dim x As Integer = 0
Do
    Console.Write(x & " ")
    x += 1
Loop While x < 10

lub

Dim x As Integer = 0
Do While x < 10
    Console.Write(x & " ")
    x += 1
Loop

0 1 2 3 4 5 6 7 8 9

Dim x As Integer = 0
Do
    Console.Write(x & " ")
    x += 1
Loop Until x = 10

lub

Dim x As Integer = 0
Do Until x = 10
    Console.Write(x & " ")
    x += 1
Loop

0 1 2 3 4 5 6 7 8 9

Continue Do można użyć do przejścia do następnej iteracji pętli:

Dim x As Integer = 0
Do While x < 10
    x += 1
    If x Mod 2 = 0 Then
        Continue Do
    End If
    Console.Write(x & " ")
Loop

1 3 5 7 9

Możesz zakończyć pętlę za pomocą Exit Do - zwróć uwagę, że w tym przykładzie brak jakiegokolwiek warunku spowodowałby nieskończoną pętlę:

Dim x As Integer = 0
Do
    Console.Write(x & " ")
    x += 1
    If x = 10 Then
        Exit Do
    End If
Loop

0 1 2 3 4 5 6 7 8 9

Zwarcie

Każda pętla może zostać zakończona lub kontynuowana wcześniej w dowolnym momencie za pomocą instrukcji Exit lub Continue .

Wyjście

Możesz zatrzymać dowolną pętlę, wychodząc wcześniej. Aby to zrobić, możesz użyć słowa kluczowego Exit wraz z nazwą pętli.

Pętla Wyjście
Dla Exit For
Dla każdego Exit For
Do While Exit Do
Podczas Exit While

Wcześniejsze wyjście z pętli to świetny sposób na zwiększenie wydajności, zapętlając tylko niezbędną liczbę razy, aby zaspokoić potrzeby aplikacji. Poniżej znajduje się przykład, w którym pętla zakończy się, gdy znajdzie liczbę 2 .

Dim Numbers As Integer() = {1,2,3,4,5}
Dim SoughtValue As Integer = 2
Dim SoughtIndex
For Each i In Numbers
    If i = 2 Then 
        SoughtIndex = i
        Exit For
    End If
Next
Debug.Print(SoughtIndex)

Kontynuacja

Oprócz wcześniejszego wyjścia możesz także zdecydować, że musisz po prostu przejść do następnej iteracji pętli. Można to łatwo zrobić za pomocą instrukcji Continue . Podobnie jak Exit , poprzedza ją nazwa pętli.

Pętla Kontynuuj Instrukcja
Dla Continue For
Dla każdego Continue For
Do While Continue Do
Podczas Continue While

Oto przykład zapobiegania dodawaniu liczb parzystych do sumy.

Dim Numbers As Integer() = {1,2,3,4,5}
Dim SumOdd As Integer = 0
For Each i In Numbers
    If Numbers(i) \ 2 = 0 Then Continue For
    SumOdd += Numbers(i)
Next

Wskazówki dotyczące użytkowania

Istnieją dwie alternatywne techniki, których można użyć zamiast opcji Exit lub Continue .

Możesz zadeklarować nową zmienną logiczną, inicjując ją do jednej wartości i warunkowo ustawiając ją na drugą wartość w pętli; następnie używasz instrukcji warunkowej (np. If ) opartej na tej zmiennej, aby uniknąć wykonywania instrukcji wewnątrz pętli w kolejnych iteracjach.

Dim Found As Boolean = False
Dim FoundIndex As Integer
For i As Integer = 0 To N - 1
    If Not Found AndAlso A(i) = SoughtValue Then
        FoundIndex = i
        Found = True
    End If
Next

Jednym z zastrzeżeń do tej techniki jest to, że może być nieefektywna. Na przykład, jeśli w powyższym przykładzie N wynosi 1000000, a pierwszy element tablicy A jest równy SoughtValue , pętla będzie iterować kolejne 999999 razy, nie robiąc nic pożytecznego. Jednak w niektórych przypadkach ta technika może mieć zaletę większej przejrzystości.

Możesz użyć instrukcji GoTo , aby wyskoczyć z pętli. Pamiętaj, że nie można użyć GoTo aby przejść do pętli.

    Dim FoundIndex As Integer
    For i As Integer = 0 To N - 1
        If A(i) = SoughtValue Then
            FoundIndex = i
            GoTo Found
        End If
    Next
    Debug.Print("Not found")
Found:
    Debug.Print(FoundIndex)

Ta technika może czasem być najładniejszym sposobem na wyskoczenie z pętli i uniknięcie jednej lub więcej instrukcji wykonywanych tuż po naturalnym końcu pętli.

Powinieneś rozważyć wszystkie alternatywy i użyć tych, które najlepiej pasują do twoich wymagań, biorąc pod uwagę takie rzeczy, jak wydajność, szybkość pisania kodu i czytelność (a więc łatwość konserwacji).

Nie zniechęcaj się, używając GoTo gdy jest to najlepsza alternatywa.

Zagnieżdżona pętla

A nested loop is a loop within a loop, an inner loop within the body of an outer one. How this works is that the first pass of the outer loop triggers the inner loop, which executes to completion. Then the second pass of the outer loop triggers the inner loop again. This repeats until the outer loop finishes. a break within either the inner or outer loop would interrupt this process.

Struktura zagnieżdżonej pętli For Next jest następująca:

For counter1=startNumber to endNumber (Step increment)

    For counter2=startNumber to endNumber (Step increment)

        One or more VB statements

    Next counter2

Next  counter1

Przykład:

    For  firstCounter = 1 to 5

      Print “First Loop of ” + firstCounter

    For   secondCounter= 1 to 4

      Print “Second Loop of ” + secondCounter

    Next secondCounter

  Next firstCounter


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow