J'ai commencé à barboter dans Windows 8 Metro récemment, et j'ai découvert qu'un de mes anciens copains semblait avoir disparu.
J'ai tendance à utiliser la méthode .ForEach()
plus que je n'utilise la construction traditionnelle foreach()
, et j'ai réalisé assez rapidement que cette méthode n'est pas disponible. Par exemple, ce code ne se compilera pas sous une application metro:
var list = new List<string>();
list.ForEach(System.Diagnostics.Debug.WriteLine);
J'ai cherché pour voir si je pouvais trouver une discussion à ce sujet, mais je n'ai pas pu. Suis-je juste obtus, ou est-ce vraiment parti?
La liste <T> .ForEach a été supprimée dans les applications de style Metro. Bien que la méthode semble simple, elle présente un certain nombre de problèmes potentiels lorsque la liste est modifiée par la méthode transmise à ForEach. Au lieu de cela, il est recommandé d'utiliser simplement une boucle foreach.
Wes Haggard | Équipe .NET Framework (BCL) | http://blogs.msdn.com/b/bclteam/
Très étrangement, cependant, il apparaît dans le documentation , dans lequel il n'est indiqué nulle part que cette méthode n'est pas prise en charge dans les applications .NET pour Windows Store (anciennement .NET pour les applications de style Metro) . Il s'agit peut-être simplement d'un oubli d'une partie de l'équipe de documentation.
Pour comprendre pourquoi il pourrait ne plus être inclus, lisez cet article par quelqu'un qui travaille dans l'équipe C # de Microsoft: http://blogs.msdn.com/b/ericlippert/archive/2009/05 /18/foreach-vs-foreach.aspx
Fondamentalement, c'est la philosophie. Les fonctionnalités "LINQ" sont fortement inspirées du paradigme de programmation fonctionnelle, et l'extension ForEach va à l'encontre de cela ... elle encourage un style fonctionnel médiocre.
Une alternative est bien sûr de le définir vous-même:
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
foreach(T item in enumeration)
{
action(item);
yield return item;
}
}
Crédit: équivalent LINQ de foreach pour IEnumerable <T>
(Remarque: pas un doublon)