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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow