Bucles: expresión for...in

Esta construcción de bucle se usa para recorrer en iteración las coincidencias de un patrón en una colección enumerable como una exprensión de rango, una secuencia, una lista, una matriz u otra construcción que admita la enumeración.

Sintaxis

for pattern in enumerable-expression do
    body-expression

Comentarios

La expresión for...in se puede comparar con la instrucción for each en otros lenguajes de .NET, porque se usa para recorrer en bucle los valores en una colección enumerable. Sin embargo, for...in también admite la coincidencia de patrones en la colección en lugar de la mera iteración en toda la colección.

La expresión enumerable se puede especificar como una colección enumerable o mediante el operador ... Las colecciones enumerables incluyen listas, secuencias, matrices, conjuntos, asignaciones, entre otros. Se puede utilizar cualquier tipo que implemente System.Collections.IEnumerable.

Al expresar un rango mediante el operador .., puede usar la sintaxis siguiente.

start .. finish

También puede usar una versión que incluya un incremento denominado skip, como en el código siguiente.

start .. skip .. finish

Si no se especifica el valor skip, el siguiente valor generado en la colección se incrementa en 1. Cuando se especifica skip, se incrementa por ese valor.

Los valores que coinciden en el patrón también se pueden usar en la expresión body.

En los ejemplos de código siguientes, se ilustra el uso de la expresión for...in.

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

La salida es la siguiente.

1
5
100
450
788

En el ejemplo siguiente, se muestra cómo recorrer en bucle una secuencia y cómo usar un patrón de tupla en lugar de una variable simple.

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

La salida es la siguiente.

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

En el ejemplo siguiente, se muestra cómo recorrer en bucle un rango de enteros simple.

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

La salida de function1 es la siguiente.

1 2 3 4 5 6 7 8 9 10

En el ejemplo siguiente, se muestra cómo recorrer en bucle un rango con un valor skip de 2, que incluye un elemento sí y otro no del rango.

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

La salida de function2 es la siguiente.

1 3 5 7 9

En el ejemplo siguiente, se muestra cómo usar un rango de caracteres.

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

La salida de function3 es la siguiente.

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

En el ejemplo siguiente, se muestra cómo usar un valor skip negativo para una iteración inversa.

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

La salida de function4 es la siguiente.

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

El inicio y el final del rango también pueden ser expresiones, como funciones, tal como en el código siguiente.

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

La salida de function5 con esta entrada es la siguiente.

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

En el ejemplo siguiente, se muestra el uso de un carácter comodín (_) cuando el elemento no es necesario en el bucle.

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

La salida es la siguiente.

Number of elements in list1: 5

Note Puede usar for...in en expresiones de secuencia y otras expresiones de cálculo, en cuyo caso se usa una versión personalizada de la expresión for...in. Para más información, consulte Secuencias, Expresiones asincrónicas, Expresiones de tareas y Expresiones de cálculo.

Vea también