Почему находится Метод ForEach только в Списке <T> набором? [дубликат]

5
задан Community 23 May 2017 в 12:28
поделиться

4 ответа

Эрик Липперт неоднократно отвечал на этот вопрос, в том числе и в своем блоге -.

Его ответом было то, что 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;
        }
    }
}
18
ответ дан 18 December 2019 в 05:55
поделиться

Прочитайте ответ человека, который помогал проектировать компилятор ... http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

6
ответ дан 18 December 2019 в 05:55
поделиться

Это было написано до методов расширения - это было добавлено в .NET 2.0. В то время не было возможности добавить его в качестве расширения к любому перечню - он должен был быть частью интерфейса (что, соглашусь, не обязательно подходит, так как перечислять может бесконечно долго, а это было бы плохо).

Я полагаю, что, когда был выпущен C# 3, они, наверное, почувствовали, что LINQ, с помощью Select, предоставляет легкую альтернативу, при этом более понятно, что это побочные эффекты. Пост Эрика Липперта в блоге на эту тему описывает побочные эффекты, а также более подробно объясняет, почему вы используете ForEach vs. foreach.

.
3
ответ дан 18 December 2019 в 05:55
поделиться

Чтобы сочинить ответ от Рэймонда Чена (которого сочинил Эрик Ганнерсон):

Каждая функция начинается с -100 пунктов.

В основном, кто-то должен был бы записать ее и тем самым отнять время у какой-то другой функции. Так как вы можете создать ForEach() самостоятельно, то это никогда не будет иметь преимущественного значения над другими, менее тривиальными функциями.

Плюс ForEach() предшествует методам расширения.

.
1
ответ дан 18 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: