Подтвердить что ты не робот

Цикл foreach с предложением where

Мне было интересно, возможно ли создать цикл foreach в C# с циклом where. Не с выражением if внутри, но и где предложение в объявлении цикла.

Может быть, что-то вроде этого?

foreach(var n in people where n.sex == male)
{
}
4b9b3361

Ответ 1

Да, возможно:

Синтаксис метода:

foreach(var person in people.Where(n => n.sex == "male"))
{
}

Или довольно длинный Синтаксис запроса:

foreach (var person in from person in people where person.sex == "male" select person) 

Ответ 2

Похоже, вам нужно выражение лямбда, чтобы ограничить элементы, с которыми работает foreach.

В зависимости от вашего ограниченного примера, примерно так:

foreach(var n in people.Where(n => n.sex == male))
{
}

Ответ 3

Как следует из ответа Юваля и его комментариев, вы можете поместить любой запрос - в форме "свободно" или "синтаксиса запроса" - в качестве выражения коллекции. Это приводит к неудобным конструкциям вроде:

foreach(var person in from person in people where person.sex == male select person) 

Не только это очень многословно, в приведенном здесь примере простое имя person используется как в запросе, так и в объявлении цикла. Вы можете удивиться, почему это даже законно, так как обычно С# строго говорит о том, что простое имя имеет только одно значение в заданной области локальной переменной. Ответ здесь: http://ericlippert.com/2009/11/05/simple-names-are-not-so-simple-part-two/

IIRC команда разработчиков С# кратко рассмотрела синтаксис, такой как вы описываете, но так и не добрался до написания спецификации. Это хорошая идея, но это просто не было достаточно удивительным расширением языка, чтобы попасть в начало списка. Это была бы приятная функция для подачи для будущей версии С#.