foreach, in (справочник по C#)foreach, in (C# reference)

Оператор foreach выполняет оператор или блок операторов для каждого элемента в экземпляре типа, который реализует интерфейс System.Collections.IEnumerable или System.Collections.Generic.IEnumerable<T>.The foreach statement executes a statement or a block of statements for each element in an instance of the type that implements the System.Collections.IEnumerable or System.Collections.Generic.IEnumerable<T> interface. Оператор foreach не ограничивается этими типами. Он может применяться к экземпляру любого типа, который удовлетворяет следующим условиям:The foreach statement is not limited to those types and can be applied to an instance of any type that satisfies the following conditions:

  • включает открытый метод GetEnumerator без параметров со следующим типом возвращаемого значения: класс, структура или тип интерфейса;has the public parameterless GetEnumerator method whose return type is either class, struct, or interface type,
  • тип возвращаемого значения метода GetEnumerator должен содержать открытое свойство Current и открытый метод MoveNext без параметров с типом возвращаемого значения Boolean.the return type of the GetEnumerator method has the public Current property and the public parameterless MoveNext method whose return type is Boolean.

В любой момент в блоке операторов foreach вы можете прервать цикл с помощью оператора break или перейти к следующей итерации в цикле с помощью оператора continue.At any point within the foreach statement block, you can break out of the loop by using the break statement, or step to the next iteration in the loop by using the continue statement. Также можно выйти из цикла foreach с помощью операторов goto, return или throw.You also can exit a foreach loop by the goto, return, or throw statements.

ПримерыExamples

Примечание

Примеры C# в этой статье выполняются во встроенном средстве выполнения кода и на площадке Try.NET.The C# examples in this article run in the Try.NET inline code runner and playground. Нажмите на кнопку Выполнить, чтобы выполнить пример в интерактивном окне.Select the Run button to run an example in an interactive window. После выполнения кода вы можете изменить его и выполнить измененный код, снова нажав на кнопку Выполнить.Once you execute the code, you can modify it and run the modified code by selecting Run again. Либо в интерактивном окне выполняется измененный код, либо, если компиляция завершается с ошибкой, в интерактивном окне отображаются все сообщения об ошибках компилятора C#.The modified code either runs in the interactive window or, if compilation fails, the interactive window displays all C# compiler error messages.

В следующем примере показано использование оператора foreach с экземпляром типа List<T>, который реализует интерфейс IEnumerable<T>:The following example shows usage of the foreach statement with an instance of the List<T> type that implements the IEnumerable<T> interface:

var fibNumbers = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13 };
int count = 0;
foreach (int element in fibNumbers)
{
    count++;
    Console.WriteLine($"Element #{count}: {element}");
}
Console.WriteLine($"Number of elements: {count}");

В следующем примере показано использование оператора foreach с экземпляром типа System.Span<T>, который не реализует интерфейс:The next example uses the foreach statement with an instance of the System.Span<T> type, which doesn't implement any interfaces:

public class IterateSpanExample
{
    public static void Main()
    {
        Span<int> numbers = new int[] { 3, 14, 15, 92, 6 };
        foreach (int number in numbers)
        {
            Console.Write($"{number} ");
        }
        Console.WriteLine();
    }
}

Начиная с версии C# 7.3, если свойство перечислителя Current возвращает ссылочное возвращаемое значение (ref T, где T — это тип элемента коллекции), вы можете объявить переменную итерации с модификатором ref или ref readonly.Beginning with C# 7.3, if the enumerator's Current property returns a reference return value (ref T where T is the type of the collection element), you can declare the iteration variable with the ref or ref readonly modifier. В следующем примере с помощью переменной итерации ref устанавливается значение каждого элемента в массиве stackalloc.The following example uses a ref iteration variable to set the value of each item in a stackalloc array. В версии ref readonly выполняется перебор коллекции для печати всех значений.The ref readonly version iterates the collection to print all the values. В объявлении readonly используется неявное объявление локальной переменной.The readonly declaration uses an implicit local variable declaration. Неявные объявления переменных могут использоваться с объявлениями ref или ref readonly, так же как и явно типизированные объявления переменных.Implicit variable declarations can be used with either ref or ref readonly declarations, as can explicitly typed variable declarations.

public class ForeachRefExample
{
    public static void Main()
    {
        Span<int> storage = stackalloc int[10];
        int num = 0;
        foreach (ref int item in storage)
        {
            item = num++;
        }

        foreach (ref readonly var item in storage)
        {
            Console.Write($"{item} ");
        }
        // Output:
        // 0 1 2 3 4 5 6 7 8 9
    }
}

Спецификация языка C#C# language specification

Дополнительные сведения см. в спецификации языка C#.For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee also