Из того, что я вижу, ForEach
метод доступен только для List
класс.
Почему это? Я не вижу причины ForEach
не быть доступным любому классу, реализовывая IEnumerable
/IEnumerator
интерфейсы, и это - действительно полезный метод, если необходимо выполнить маленькое действие (1 строка более читаема, чем 1 строка + 2 шаблона foreach синтаксис...).
Обновление: я разъясню свой вопрос. Существуют совершенно допустимые причины включения ForEach
в последовательностях. Существуют совершенно серьезные основания для не включая ForEach
во всех последовательностях.
Но я не могу понять, почему был бы ForEach
будьте включены в просто некоторые последовательности.
См. почту Эрика Липперта: "foreach" против "ForEach"
Ряд людей спрашивали меня, почему не предоставленный Microsoft Расширение оператора последовательности "ForEach" метод. Класс List имеет такой метод, конечно, уже есть, но есть нет причин, по которым такой метод не мог создаваться как способ расширения для все последовательности.
...
Но здесь мы можем пойти немного глубже. Я философски противоположный предоставлению такой метод, по двум причинам.
...
Первая причина в том. нарушает функциональное программирование принципы, что вся остальная последовательность основаны на операторах. Очевидно, что единственная цель вызова этого метода это вызвать побочные эффекты.
...
Вторая причина в том, что делать это... добавляет ноль новых представительских полномочий к языку.
...
Ну, команда "VS Languages" не оказывать какое-либо влияние на то, что происходит Список. Лично я нахожу Метод "ForEach" в списке философски беспокоящий всех те же причины, по которым я нашел бы метод расширения IEnumerable беспокоит. (И команда VSL контролировать это.) Тот, который смягчает Дело в том, что Список, несомненно. разработанный, чтобы быть мутирующим, не имеющая побочных эффектов структура данных, поэтому использование выражений, мутирующих его кажется немного менее плохим. -- Эрик
здесь - это другая версия метода расширения .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);
}
}
ПРАВИЛЬНО. Однако, если вы хотите использовать преимущество Foreach Loop, есть метод, называемый «Tolist», как показано ниже, используемый ниже, используемый для преобразования массива обратно в список.
String[] array = new String[3];
List<String> list = array.ToList<String>();
Технически, с .NET 3.5, вы могли бы сделать это: (вам нужно включить System.Linq)
IEnumerable<string> a = ...
a.All(i => { DoSomethingWith(i); return true; });
Вы правы, метод определен в классе List. Однако довольно легко создать метод расширения, который делает то же самое.
public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
foreach (var t in enumerable)
action(t);
}