Delen via


Lussen: voor... in expressie

Deze lusconstructie wordt gebruikt om de overeenkomsten van een patroon in een opsommingsbare verzameling te herhalen, zoals een bereikexpressie, reeks, lijst, matrix of andere constructie die opsomming ondersteunt.

Syntaxis

for pattern in enumerable-expression do
    body-expression

Opmerkingen

De for...in expressie kan worden vergeleken met de for each instructie in andere .NET-talen, omdat deze wordt gebruikt om de waarden in een enumerable verzameling te doorlopen. for...in Ondersteunt echter ook patroonkoppelingen via de verzameling in plaats van alleen iteratie over de hele verzameling.

De enumerable-expressie kan worden opgegeven als een opsommingsbare verzameling of met behulp van de .. operator. Opsommenbare verzamelingen zijn lijsten, reeksen, matrices, sets, kaarten enzovoort. Elk type dat wordt geïmplementeerd System.Collections.IEnumerable , kan worden gebruikt.

Wanneer u een bereik uitdrukt met behulp van de .. operator, kunt u de volgende syntaxis gebruiken.

start .. Voltooien

U kunt ook een versie gebruiken die een incrementeel overslaan bevat, zoals in de volgende code.

start .. skip .. Voltooien

Als de waarde voor overslaan niet is opgegeven, wordt de volgende waarde die in de verzameling wordt gegenereerd, verhoogd met 1. Wanneer skip is opgegeven, wordt deze verhoogd door die waarde.

Waarden die in het patroon overeenkomen, kunnen ook worden gebruikt in de hoofdtekstexpressie.

De volgende codevoorbeelden illustreren het gebruik van de for...in expressie.

// Looping over a list.
let list1 = [ 1; 5; 100; 450; 788 ]
for i in list1 do
   printfn "%d" i

De uitvoer is als volgt.

1
5
100
450
788

In het volgende voorbeeld ziet u hoe u een reeks doorloopt en hoe u een tuple-patroon gebruikt in plaats van een eenvoudige variabele.

let seq1 = seq { for i in 1 .. 10 -> (i, i*i) }
for (a, asqr) in seq1 do
  printfn "%d squared is %d" a asqr

De uitvoer is als volgt.

1 squared is 1
2 squared is 4
3 squared is 9
4 squared is 16
5 squared is 25
6 squared is 36
7 squared is 49
8 squared is 64
9 squared is 81
10 squared is 100

In het volgende voorbeeld ziet u hoe u een lus over een eenvoudig geheel getal kunt uitvoeren.

let function1() =
  for i in 1 .. 10 do
    printf "%d " i
  printfn ""
function1()

De uitvoer van functie1 is als volgt.

1 2 3 4 5 6 7 8 9 10

In het volgende voorbeeld ziet u hoe u een bereik kunt doorlopen met een skip van 2, die elk ander element van het bereik bevat.

let function2() =
  for i in 1 .. 2 .. 10 do
     printf "%d " i
  printfn ""
function2()

De uitvoer is function2 als volgt.

1 3 5 7 9

In het volgende voorbeeld ziet u hoe u een tekenbereik gebruikt.

let function3() =
  for c in 'a' .. 'z' do
    printf "%c " c
  printfn ""
function3()

De uitvoer is function3 als volgt.

a b c d e f g h i j k l m n o p q r s t u v w x y z

In het volgende voorbeeld ziet u hoe u een negatieve skip-waarde gebruikt voor een omgekeerde iteratie.

let function4() =
    for i in 10 .. -1 .. 1 do
        printf "%d " i
    printfn " ... Lift off!"
function4()

De uitvoer is function4 als volgt.

10 9 8 7 6 5 4 3 2 1 ... Lift off!

Het begin en einde van het bereik kunnen ook expressies zijn, zoals functies, zoals in de volgende code.

let beginning x y = x - 2*y
let ending x y = x + 2*y

let function5 x y =
  for i in (beginning x y) .. (ending x y) do
     printf "%d " i
  printfn ""

function5 10 4

De uitvoer van function5 deze invoer is als volgt.

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

In het volgende voorbeeld ziet u het gebruik van een jokerteken (_) wanneer het element niet nodig is in de lus.

let mutable count = 0
for _ in list1 do
   count <- count + 1
printfn "Number of elements in list1: %d" count

De uitvoer is als volgt.

Number of elements in list1: 5

Note U kunt in sequentie-expressies en andere rekenexpressies gebruiken for...in . In dat geval wordt een aangepaste versie van de for...in expressie gebruikt. Zie Reeksen, Asynchrone expressies, taakexpressies en rekenexpressies voor meer informatie.

Zie ook