Schleifen: for...in-Ausdruck

Dieses Schleifenkonstrukt wird zum Durchlaufen der Übereinstimmungen eines Musters in einer aufzählbaren Auflistung verwendet, z. B. für eine Reihe von Ausdrücken, eine Sequenz, Liste, ein Array oder ein anderes Konstrukt, das Enumeration unterstützt.

Syntax

for pattern in enumerable-expression do
    body-expression

Bemerkungen

Der for...in-Ausdruck kann mit der for each-Anweisung in anderen .NET-Sprachen verglichen werden, weil er verwendet wird, um die Werte in einer aufzählbaren Sammlung zu durchlaufen. for...in unterstützt jedoch auch Musterabgleich über die Sammlung, anstatt nur Iteration über die gesamte Sammlung durchzuführen.

Der aufzählbare Ausdruck kann als aufzählbare Collection oder mithilfe des ..-Operators angegeben werden. Aufzählbare Sammlungen umfassen Listen, Sequenzen, Arrays, Mengen, Zuordnungen usw. Jeder Typ, der System.Collections.IEnumerable implementiert, kann verwendet werden.

Wenn Sie einen Bereich mithilfe des ..-Operators ausdrücken, können Sie die folgende Syntax verwenden.

start .. finish

Sie können auch eine Version verwenden, die wie im folgenden Code ein Inkrement namens skip enthält.

start .. skip .. finish

Wenn der skip-Wert nicht angegeben ist, wird der nächste in der Collection generierte Wert um 1 erhöht. Wenn ein skip-Wert angegeben wird, wird er um diesen Wert erhöht.

Werte, die im Muster übereinstimmen, können auch im Textkörperausdruck verwendet werden.

In den folgenden Codebeispielen wird die Verwendung des for...in-Ausdrucks veranschaulicht.

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

Die Ausgabe lautet wie folgt.

1
5
100
450
788

Im folgenden Beispiel wird gezeigt, wie eine Sequenz in einer Schleife durchlaufen und ein Tupelmuster anstelle einer einfachen Variablen verwendet wird.

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

Die Ausgabe lautet wie folgt.

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

Das folgende Beispiel zeigt, wie eine Schleife über einen einfachen Integerbereich ausgeführt wird.

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

Die Ausgabe von function1 sieht wie folgt aus.

1 2 3 4 5 6 7 8 9 10

Das folgende Beispiel zeigt, wie Sie einen Bereich mit einem skip-Wert von 2 in einer Schleife durchlaufen, der jedes andere Element des Bereichs enthält.

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

Die Ausgabe von function2 lautet wie folgt.

1 3 5 7 9

Im folgenden Beispiel wird gezeigt, wie ein Zeichenbereich verwendet wird.

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

Die Ausgabe von function3 lautet wie folgt.

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

Im folgenden Beispiel wird gezeigt, wie ein negativer skip-Wert für eine umgekehrte Iteration verwendet wird.

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

Die Ausgabe von function4 lautet wie folgt.

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

Der Anfang und das Ende des Bereichs können auch Ausdrücke sein, z. B. Funktionen, wie im folgenden Code gezeigt.

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

Die Ausgabe von function5 mit dieser Eingabe lautet wie folgt.

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

Das nächste Beispiel zeigt die Verwendung eines Platzhalterzeichens (_), wenn das Element in der Schleife nicht benötigt wird.

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

Die Ausgabe lautet wie folgt.

Number of elements in list1: 5

Note Sie können for...in in Sequenzausdrücken und anderen Berechnungsausdrücken verwenden. In diesem Fall wird eine angepasste Version des for...in-Ausdrucks verwendet. Weitere Informationen finden Sie unter Sequenzen, Asynchrone Ausdrücke, Taskausdrücke und Berechnungsausdrücke.

Weitere Informationen