Visual Basic .NET Language
Pętla
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