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

Практически в каждом языке стандартным способом является использование отдельной переменной, которая в данном случае является нашим счетчиком. Как здесь, для C#:

List<string> listToIterate = new List<string>() { "one", "two", "three", "four", "five" };

int i = 1;
foreach (string item in listToIterate)
{
    System.Console.WriteLine($"A list index: {i}, a list element: {item}");
    i += 1;
}

И F# здесь:

let listToIterate = [ "one"; "two"; "three"; "four"; "five" ]

let mutable i = 0
for item in listToIterate do
    printfn $"A list index: {i}, a list element: {item}"
    i <- i + 1

Вывод кода C# и F#:

В обоих случаях есть простой способ сделать код короче и лаконичнее.

Для C# мы можем использовать LINQ:

List<string> listToIterate = new List<string>() { "one", "two", "three", "four", "five" };

foreach (var item in listToIterate.Select((listEmlement, i) => (listEmlement, i)))
{
    Console.WriteLine($"A list index: {item.i}, a list element: {item.listEmlement}");
}

В F# мы используем конвейер, который индексирует список на первом этапе, затем перебирает новый список и печатает каждый элемент.

let listToIterate = [ "one"; "two"; "three"; "four"; "five" ]

listToIterate
|> List.indexed
|> List.iter (fun (i, item) -> printfn "A list index: %d, a list element: %s" i item)