循环:for...in 表达式

循环构造用于循环访问可枚举集合(例如范围表达式、序列、列表、数组或其他支持枚举的构造)中的模式的匹配项。

语法

for pattern in enumerable-expression do
    body-expression

备注

for...in 表达式可以与其他 .NET 语言中的 for each 语句进行比较,因为它用于循环访问可枚举集合中的值。 但 for...in 还支持对集合进行模式匹配,而不是只循环访问整个集合。

可枚举表达式可指定为可枚举的集合,也可以通过使用 .. 运算符指定。 可枚举集合包括列表、序列、数组、集和映射等。 可以使用任何实现 System.Collections.IEnumerable 的类型。

当你使用 .. 运算符表示范围时,可以使用以下语法。

start .. finish

你还可以使用包含一个称为 skip的增量的版本,如下面的代码所示。

start .. skip .. finish

如果未指定 skip 值,则集合中生成的下一个值将递增 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

下面的示例演示如何使用 skip 值 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

下面的示例演示如何对反向迭代使用负的 skip 值。

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 表达式。 有关详细信息,请参阅序列异步表达式任务表达式计算表达式

另请参阅