Поделиться через


Циклы: выражение for...in (F#)

Эта конструкция для организации циклов используется для перебора в перечислимой коллекции при соответствии шаблона, например в выражении диапазона, в последовательности, в списке, в массиве или в другой конструкции, поддерживающей перечисление.

for pattern in enumerable-expression do
   body-expression

Заметки

Выражение for…in можно сравнить с инструкцией for each в других языках .NET, поскольку оно служит для перебора элементов в перечислимой коллекции. Но выражение for…in также поддерживает проверку соответствия шаблону в коллекции, а не только простой перебор всех элементов коллекции.

Перечислимое выражение можно задать в виде перечислимой коллекции или с помощью оператора .. в виде диапазона целочисленных значений. К перечислимым коллекциям относятся списки, последовательности, массивы, наборы, сопоставления и т. д. Можно использовать любой тип, поддерживающий интерфейс IEnumerable.

При определении диапазона с помощью оператора .. можно использовать следующий синтаксис.

start .. finish

Можно также использовать версию, в которой инкремент имеет значение пропуска, как показано в следующем примере.

start .. skip .. finish

Если в качестве шаблона в целочисленном диапазоне используется простая переменная-счетчик, то обычно счетчик при каждой итерации увеличивается на 1, но если диапазон содержит значение пропуска, то счетчик будет увеличиваться на это значение.

Значения, соответствующие шаблону, также можно использовать в теле цикла.

В следующих примерах кода показано использование выражения 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

Примечание Выражение for...in можно использовать в выражениях последовательности и других вычислительных выражениях, при этом используется настроенная версия выражения for...in. Дополнительные сведения см. в разделах Последовательности (F#), Асинхронные рабочие потоки (F#) и Выражения вычисления (F#).

См. также

Ссылки

Циклы. Выражение for...to (F#)

Циклы: выражение while...do (F#)

Другие ресурсы

Справочник по языку F#