Почему метод ForEach только для списков

Из того, что я вижу, ForEach метод доступен только для List класс.

Почему это? Я не вижу причины ForEach не быть доступным любому классу, реализовывая IEnumerable/IEnumerator интерфейсы, и это - действительно полезный метод, если необходимо выполнить маленькое действие (1 строка более читаема, чем 1 строка + 2 шаблона foreach синтаксис...).

Обновление: я разъясню свой вопрос. Существуют совершенно допустимые причины включения ForEach в последовательностях. Существуют совершенно серьезные основания для не включая ForEachво всех последовательностях.

Но я не могу понять, почему был бы ForEach будьте включены в просто некоторые последовательности.

9
задан Elazar Leibovich 1 February 2010 в 18:54
поделиться

5 ответов

См. почту Эрика Липперта: "foreach" против "ForEach"

Ряд людей спрашивали меня, почему не предоставленный Microsoft Расширение оператора последовательности "ForEach" метод. Класс List имеет такой метод, конечно, уже есть, но есть нет причин, по которым такой метод не мог создаваться как способ расширения для все последовательности.

...

Но здесь мы можем пойти немного глубже. Я философски противоположный предоставлению такой метод, по двум причинам.

...

Первая причина в том. нарушает функциональное программирование принципы, что вся остальная последовательность основаны на операторах. Очевидно, что единственная цель вызова этого метода это вызвать побочные эффекты.

...

Вторая причина в том, что делать это... добавляет ноль новых представительских полномочий к языку.

...

Ну, команда "VS Languages" не оказывать какое-либо влияние на то, что происходит Список. Лично я нахожу Метод "ForEach" в списке философски беспокоящий всех те же причины, по которым я нашел бы метод расширения IEnumerable беспокоит. (И команда VSL контролировать это.) Тот, который смягчает Дело в том, что Список, несомненно. разработанный, чтобы быть мутирующим, не имеющая побочных эффектов структура данных, поэтому использование выражений, мутирующих его кажется немного менее плохим. -- Эрик

23
ответ дан 4 December 2019 в 06:49
поделиться

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

(Это было написано для использования с VS 2010 ... Если вы используете предыдущую версию, вам, вероятно, понадобится удалить = NULL от метода подписи)

public static void SafeForEach<T>(this IEnumerable<T> input,
                                       Action<T> action,
                                       Action<T, Exception> faultAction = null)
{
    if (input == null || action == null)
        return;
    foreach (var item in input)
        try
        {
            action(item);
        }
        catch (Exception ex)
        {
            if (faultAction == null)
                Debug.WriteLine(ex);
            else
                faultAction(item, ex);
        }
}
0
ответ дан 4 December 2019 в 06:49
поделиться

ПРАВИЛЬНО. Однако, если вы хотите использовать преимущество Foreach Loop, есть метод, называемый «Tolist», как показано ниже, используемый ниже, используемый для преобразования массива обратно в список.

String[] array = new String[3];
List<String> list = array.ToList<String>();
2
ответ дан 4 December 2019 в 06:49
поделиться

Технически, с .NET 3.5, вы могли бы сделать это: (вам нужно включить System.Linq)

IEnumerable<string> a = ...

a.All(i => { DoSomethingWith(i); return true; });
2
ответ дан 4 December 2019 в 06:49
поделиться

Вы правы, метод определен в классе List. Однако довольно легко создать метод расширения, который делает то же самое.

public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
    foreach (var t in enumerable)
        action(t);
}
7
ответ дан 4 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

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