Не исчез ли метод List <T>.ForEach()?
В последнее время я начал болтать в Windows 8, и обнаружил, что один из моих старых приятелей, похоже, пропал без вести.
Я предпочитаю использовать метод .ForEach()
больше, чем традиционную конструкцию foreach()
, и я довольно быстро понял, что этот метод недоступен. Например, этот код не будет компилироваться в приложении метро:
var list = new List<string>();
list.ForEach(System.Diagnostics.Debug.WriteLine);
Я искал, мог ли я найти какое-либо обсуждение этого вопроса, но не смог. Я просто тупой, или он действительно ушел?
Ответы
Ответ 1
Это действительно прошло:
Список <T> .ForEach был удален в приложениях стиля Metro. Хотя метод кажется простым, он имеет ряд потенциальных проблем, когда список получает мутацию методом, переданным в ForEach. Вместо этого рекомендуется просто использовать цикл foreach.
Уэс Хаггард | Команда .NET Framework (BCL) | http://blogs.msdn.com/b/bclteam/
Очень странно, однако, он появляется в документации , в которой нигде не говорится, что этот метод не поддерживается в .NET для приложений Windows Store (ранее .NET для приложений в стиле Metro). Возможно, это всего лишь надзор со стороны команды по документации.
Ответ 2
Чтобы понять, почему он больше не может быть включен, прочитайте этот пост тем, кто работает в команде С# в Microsoft: http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
В принципе, это философия. Функции "LINQ" очень вдохновлены парадигмой функционального программирования, и расширение ForEach летит перед лицом этого... оно поощряет плохой функциональный стиль.
Ответ 3
Альтернативой является определение этого самостоятельно:
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
foreach(T item in enumeration)
{
action(item);
yield return item;
}
}
Кредит: LINQ эквивалент foreach для IEnumerable <T>
(Примечание: не дубликат)