Andriy Shyrokoryadov

.Net developer, data scientist

Как работает foreach - вопрос №9 на собеседование C# / .NET

Текст к видео "Как работает foreach" на канале YouTube

Оператор цикла foreach является одним из 4 операторов цикла в языке C#. Foreach используется в ситуациях когда Вам необходимо перебрать всё элементы в коллекции и в процессе перебора элементов выполнить над ними какие-то операции. Интересной особенностью оператора foreach является то, что он может перебирать не только элементы конкретной готовой коллекции, но и также элементы, которые являются результатом выражения LINQ.

LINQ – это сокращение на английском языке, которое означает Language Integrated Query (язык интегрированных запросов). Выражение LINQ это инструмент, при помощи которого, можно выполнить запрос к определенной коллекции кратко и понятно, что улучшает читаемость кода и облегчается работу с этим кодом. Так вот, если мы припишем какой-либо переменной значение выражения LINQ, то в этом переменной будет сохранено выражение LINQ, а не результат этого выражения. Такое поведение является одной из особенностей выражений LINQ и называется оно - отложенное выполнение.

Итак, что необходимо сделать, чтобы получить результат выражения LINQ из переменной с выражением LINQ. Сначала необходимо подумать - чем является результат выражения LINQ. Как правило, результатом выражения LINQ является коллекция. А если это коллекция, значит мы можем использовать для перебора данных, которые содержаться в данной коллекции, оператор цикла foreach. То есть работа оператора foreach, кроме всего прочего, характеризуется стартом отложенного выполнения выражения LINQ.

С какой целью в выражениях LINQ используется отложенное выполнение? Цель следующая – при каждом переборе результатов выражения LINQ вы должны получить самые новые и актуальные данные. Возможно, произошли какие-то изменения с вашими коллекциями и результат выражения LINQ изменился. Благодаря отложенному выполнению вы получить этот самый новый, самый актуальный, измененный результат выражения LINQ.

Использование в синтаксисе оператора цикла foreach не является единственным способом материализовать результат выражения LINQ. Однако остальные способы материализации результата так или иначе связанны с перебором элементов коллекции, которые возвращаются в виде результата выражения LINQ.