Visual Basic .NET Language
looping
Sök…
För nästa
For
... Next
slinga används för att upprepa samma åtgärd ett begränsat antal gånger. Uttalningarna i följande slinga kommer att köras 11 gånger. Första gången har i
värdet 0, andra gången kommer det att ha värdet 1, förra gången kommer det att ha värdet 10.
For i As Integer = 0 To 10
'Execute the action
Console.Writeline(i.ToString)
Next
Vilket heltal som helst kan användas för att parametrera slingan. Det är tillåtet men krävs inte att kontrollvariabeln (i detta fall i
) också anges efter Next
. Det är tillåtet att kontrollvariabeln deklareras i förväg, snarare än inom For
uttalandet.
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
Genom att kunna definiera Start- och Slut-heltal kan det skapas slingor som direkt hänvisar till andra objekt, till exempel:
For i = 0 to DataGridView1.Rows.Count - 1
Console.Writeline(DataGridView1.Rows(i).Cells(0).Value.ToString)
Next
Detta skulle sedan slinga genom varje rad i DataGridView1
och utföra åtgärden att skriva värdet på kolumn 1 till konsolen. (-1 beror på att den första raden i de räknade raderna skulle vara 1, inte 0)
Det är också möjligt att definiera hur styrvariabeln måste öka.
For i As Integer = 1 To 10 Step 2
Console.Writeline(i.ToString)
Next
Denna utgångar:
1 3 5 7 9
Det är också möjligt att minska styrvariabeln (räkna ner).
For i As Integer = 10 To 1 Step -1
Console.Writeline(i.ToString)
Next
Denna utgångar:
10 9 8 7 6 5 4 3 2 1
Du bör inte försöka använda (läsa eller uppdatera) kontrollvariabeln utanför slingan.
För varje ... Nästa slinga för looping genom samling av artiklar
Du kan använda en For Each...Next
slinga för att iterera igenom alla IEnumerable
typer. Detta inkluderar matriser, listor och allt annat som kan vara av typ IEnumerable eller returnerar en IEnumerable.
Ett exempel på att gå igenom en DataTable's Rows-egenskap skulle se ut så här:
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
En viktig sak att notera är att samlingen inte får ändras i en For Each
slinga. Om du gör det orsakar ett System.InvalidOperationException
med meddelandet:
Samlingen modifierades; uppräkning kan inte utföras.
Medan slinga för att iterera medan vissa villkor är sanna
En While
slinga börjar med att utvärdera ett tillstånd. Om det är sant körs slingans kropp. Efter att slingans kropp har utförts utvärderas While
tillståndet igen för att avgöra om kroppen ska köras ut igen.
Dim iteration As Integer = 1
While iteration <= 10
Console.Writeline(iteration.ToString() & " ")
iteration += 1
End While
Denna utgångar:
1 2 3 4 5 6 7 8 9 10
Varning: A While
slinga kan leda till en oändlig slinga . Tänk på vad som skulle hända om den kodrad som ökar iteration
tas bort. I ett sådant fall skulle villkoret aldrig vara sant och slingan skulle fortsätta på obestämd tid.
Gör ... Loop
Använd Do...Loop
att upprepa ett block med uttalanden While
eller Until
ett villkor är sant, kontrollera villkoret antingen i början eller i slutet av slingan.
Dim x As Integer = 0
Do
Console.Write(x & " ")
x += 1
Loop While x < 10
eller
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
eller
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
kan användas för att hoppa till nästa iteration av slingan:
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
Du kan avsluta slingan med Exit Do
- Observera att bristen på något villkor i detta exempel annars skulle orsaka en oändlig loop:
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
Kortslutning
Alla slingor kan avslutas eller fortsättas tidigt när som helst med hjälp av Exit
eller Continue
.
avsluta
Du kan stoppa valfri slinga genom att lämna tidigt. För att göra detta kan du använda nyckelordet Exit
tillsammans med loopens namn.
Slinga | Utgångsdeklaration |
---|---|
För | Exit For |
För varje | Exit For |
Göra medan | Exit Do |
Medan | Exit While |
Att gå ut från en slinga tidigt är ett bra sätt att öka prestanda genom att bara slinga det nödvändiga antalet gånger för att tillfredsställa applikationens behov. Nedan är ett exempel där slingan kommer att avsluta när den hittar numret 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)
Fortlöpande
Tillsammans med att lämna tidigt, kan du också bestämma att du bara behöver gå vidare till nästa loop-iteration. Detta görs enkelt genom att Continue
uttalandet. Precis som Exit
fortsätter det med loopnamnet.
Slinga | Fortsätt uttalandet |
---|---|
För | Continue For |
För varje | Continue For |
Göra medan | Continue Do |
Medan | Continue While |
Här är ett exempel på att förhindra att jämna nummer läggs till summan.
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
Användningsråd
Det finns två alternativa tekniker som kan användas istället för att använda Exit
eller Continue
.
Du kan förklara en ny boolesisk variabel, initialisera den till ett värde och villkorligt ställa in den till det andra värdet i slingan; använder du sedan ett villkorligt uttalande (t.ex. If
) baserat på den variabeln för att undvika exekvering av uttalanden inuti slingan i efterföljande iterationer.
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
En av invändningarna mot denna teknik är att den kan vara ineffektiv. Om till exempel i ovanstående exempel är N
1000000 och det första elementet i matrisen A
är lika med SoughtValue
, kommer slingan att iterera ytterligare 999999 gånger utan att göra något användbart. Emellertid kan denna teknik ha fördelen med större tydlighet i vissa fall.
Du kan använda GoTo
uttalandet för att hoppa ur slingan. Observera att du inte kan använda GoTo
att hoppa in i en slinga.
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)
Den här tekniken kan ibland vara det snyggaste sättet att hoppa ut ur slingan och undvika en eller flera påståenden som utförs strax efter den naturliga änden av slingan.
Du bör överväga alla alternativ och använda det som bäst passar dina krav, med tanke på effektivitet, hastighet att skriva koden och läsbarhet (därmed underhållbarhet).
Släpp inte av med GoTo
vid de tillfällen då det är det bästa alternativet.
Nested Loop
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.
Strukturen för en för nästa kapslad slinga är:
For counter1=startNumber to endNumber (Step increment)
For counter2=startNumber to endNumber (Step increment)
One or more VB statements
Next counter2
Next counter1
Exempel:
For firstCounter = 1 to 5
Print “First Loop of ” + firstCounter
For secondCounter= 1 to 4
Print “Second Loop of ” + secondCounter
Next secondCounter
Next firstCounter