Эрик Липперт неоднократно отвечал на этот вопрос, в том числе и в своем блоге -.
Его ответом было то, что ForEach()
явно используется для своих побочных эффектов - в то время как LINQ во многом предназначен для свободного от побочных эффектов API для определения проекций и манипуляций с последовательностями.
Вне использования таких циклов, как параллельные циклы, функциональный Синтаксис ForEach
не добавляет много выразительных возможностей, и он несколько менее эффективен, чем обычный foreach
цикл из-за вызовов делегатов.
Если вы действительно, действительно хотите ForEach
для IEnumerable
, то нетрудно написать:
public static class ForEachExtension
{
public static void ForEach<T>( this IEnumerable<T> seq, Action<T> action )
{
foreach( var item in seq )
action( item );
}
// Here's a lazy, streaming version:
public static IEnumerable<T> ForEachLazy<T>( this IEnumerable<T> seq, Action<T> action )
{
foreach( var item in seq )
{
action( item );
yield return item;
}
}
}
Прочитайте ответ человека, который помогал проектировать компилятор ... http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
Это было написано до методов расширения - это было добавлено в .NET 2.0. В то время не было возможности добавить его в качестве расширения к любому перечню - он должен был быть частью интерфейса (что, соглашусь, не обязательно подходит, так как перечислять может бесконечно долго, а это было бы плохо).
Я полагаю, что, когда был выпущен C# 3, они, наверное, почувствовали, что LINQ, с помощью Select, предоставляет легкую альтернативу, при этом более понятно, что это побочные эффекты. Пост Эрика Липперта в блоге на эту тему описывает побочные эффекты, а также более подробно объясняет, почему вы используете ForEach vs. foreach.
.Чтобы сочинить ответ от Рэймонда Чена (которого сочинил Эрик Ганнерсон):
В основном, кто-то должен был бы записать ее и тем самым отнять время у какой-то другой функции. Так как вы можете создать ForEach()
самостоятельно, то это никогда не будет иметь преимущественного значения над другими, менее тривиальными функциями.
Плюс ForEach()
предшествует методам расширения.