La méthode List .ForEach () a-t-elle disparu?

J’ai commencé à barboter dans Windows 8 récemment et j’ai découvert qu’un de mes anciens amis semblait avoir disparu.

J’ai tendance à utiliser la méthode .ForEach() plus que la méthode traditionnelle de foreach() , et je me suis vite rendu compte que cette méthode n’était pas disponible. Par exemple, ce code ne sera pas compilé sous une application de métro:

 var list = new List(); 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 le faire. Suis-je juste obtus, ou est-ce que c’est parti?

C’est en effet parti:

La liste .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 mutée par la méthode transmise à ForEach. Au lieu de cela, il est recommandé d’utiliser simplement une boucle foreach.


Wes Haggard | .NET Framework Team (BCL) | http://blogs.msdn.com/b/bclteam/

Curieusement, cependant, il fait une apparition dans la documentation , où nulle part il n’est indiqué 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). Peut-être que ce n’est qu’un oubli de la part de l’équipe de documentation.

Pour avoir une idée de la raison pour laquelle il pourrait ne plus être inclus, lisez ce post par quelqu’un qui travaille sur 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 par le paradigme de la functional programming, et l’extension ForEach est en contradiction avec cela … elle encourage un style fonctionnel médiocre.

Une alternative est de le définir vous-même bien sûr:

 public static IEnumerable ForEach(this IEnumerable enumeration, Action action) { foreach(T item in enumeration) { action(item); yield return item; } } 

Crédit: LINQ équivalent de foreach pour IEnumerable

(Note: pas un duplicata)