Подтвердить что ты не робот

Не исчез ли метод List <T>.ForEach()?

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

Я предпочитаю использовать метод .ForEach() больше, чем традиционную конструкцию foreach(), и я довольно быстро понял, что этот метод недоступен. Например, этот код не будет компилироваться в приложении метро:

var list = new List<string>();

list.ForEach(System.Diagnostics.Debug.WriteLine);

Я искал, мог ли я найти какое-либо обсуждение этого вопроса, но не смог. Я просто тупой, или он действительно ушел?

4b9b3361

Ответ 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>

(Примечание: не дубликат)