Вы не должны использовать расширение LINQ ForEach. Позвольте мне объяснить, почему:
LINQ foreach нарушает принципы функционального программирования, на которых основаны все другие операторы последовательности. Очевидно, что единственная цель вызова этого метода - вызвать побочные эффекты. Цель выражения - вычислить значение, а не вызывать побочный эффект. Цель заявления - вызвать побочный эффект. Сайт вызова этой вещи выглядел бы ужасно, как выражение
Вторая причина заключается в том, что использование этого добавляет к вашему коду нулевое репрезентативное значение.Это позволит вам переписать этот совершенно чистый код:
foreach (Foo foo in foos) {statement with foo; }
в этот код:
foos.ForEach ((Foo Foo) => {заявление с участием Foo;});
, который использует почти точно такие же символы в несколько ином порядке. И все же вторая версия сложнее понять, сложнее отладить и вводит семантику закрытия, тем самым потенциально изменяя сроки жизни объектов тонким образом.
Выше приведено краткое описание блога Сообщение от Эрика Липперта. Читайте полный пост here.
Что больше расширение было удалено с помощью BCL команды в Windows 8:
List.ForEach был удален в приложениях в стиле Metro. Хотя метод кажется простым, он имеет ряд потенциальных проблем, когда список получает мутацию методом, переданным в ForEach.
Вместо этого рекомендуется просто использовать цикл foreach.
Почему вы хотите, чтобы linq был isntead foreach? – Grundy
Избегайте foreach, почему так? – Reniuz
Я бы хотел увидеть обоснование использования LINQ здесь. LINQ является синтаксисом * запроса *, поэтому в ваших обстоятельствах это не подходит. Однако, с учетом сказанного здесь, это простой [ForEach] (http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet) расширение, которое вы могли бы использовать для этого. – James