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