此循环构造用于循环访问可枚举集合中模式的匹配项,例如范围表达式、序列、列表、数组或其他支持枚举的构造。
语法
for pattern in enumerable-expression do
body-expression
注解
for...in
表达式可以与其他 for each
.NET 语言中的语句进行比较,因为它用于循环访问可枚举集合中的值。 但是,还支持对集合进行模式匹配, for...in
而不是仅对整个集合进行迭代。
可枚举表达式可以指定为可枚举集合,也可以使用运算符指定 ..
。 可枚举集合包括列表、序列、数组、集、映射等。 可以使用任何实现 System.Collections.IEnumerable
的类型。
使用 ..
运算符表达范围时,可以使用以下语法。
start .. finish
还可以使用包含名为 skip 的增量的版本,如以下代码所示。
start .. 跳过 .. finish
如果未指定跳过值,则集合中生成的下一个值将递增 1。 指定 skip 时,它会按该值递增。
在模式中匹配的值也可以在正文表达式中使用。
下面的代码示例演示了 for...in
表达式的使用。
// Looping over a list.
let list1 = [ 1; 5; 100; 450; 788 ]
for i in list1 do
printfn "%d" i
输出如下所示。
1
5
100
450
788
以下示例演示如何循环访问序列,以及如何使用元组模式而不是简单变量。
let seq1 = seq { for i in 1 .. 10 -> (i, i*i) }
for (a, asqr) in seq1 do
printfn "%d squared is %d" a asqr
输出如下所示。
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
以下示例演示如何循环访问简单的整数范围。
let function1() =
for i in 1 .. 10 do
printf "%d " i
printfn ""
function1()
function1 的输出如下所示。
1 2 3 4 5 6 7 8 9 10
以下示例演示如何循环访问包含 2 个跳过的范围,其中包括该区域的所有其他元素。
let function2() =
for i in 1 .. 2 .. 10 do
printf "%d " i
printfn ""
function2()
function2
输出如下所示。
1 3 5 7 9
以下示例演示如何使用字符范围。
let function3() =
for c in 'a' .. 'z' do
printf "%c " c
printfn ""
function3()
function3
输出如下所示。
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
以下示例演示如何对反向迭代使用负跳过值。
let function4() =
for i in 10 .. -1 .. 1 do
printf "%d " i
printfn " ... Lift off!"
function4()
function4
输出如下所示。
10 9 8 7 6 5 4 3 2 1 ... Lift off!
范围的开头和结尾也可以是表达式,例如函数,如以下代码所示。
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
此输入的 function5
输出如下所示。
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
下一个示例演示在循环中不需要元素时使用通配符 (_)。
let mutable count = 0
for _ in list1 do
count <- count + 1
printfn "Number of elements in list1: %d" count
输出如下所示。
Number of elements in list1: 5
Note
可以在序列表达式和其他计算表达式中使用 for...in
,在这种情况下,将使用自定义版本的 for...in
表达式。 有关详细信息,请参阅 序列、 异步表达式、 任务表达式和 计算表达式。