Expression Lambda utilisant la clause Foreach

Duplication possible:
Pourquoi n’y a-t-il pas une méthode d’extension ForEach sur l’interface IEnumerable?

MODIFIER

Pour référence, voici le billet de blog auquel eric a fait référence dans les commentaires

http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

ORIG

Plus d’une curiosité, je suppose, mais une pour la spécification C # Savants …

Pourquoi la clause ForEach () ne fonctionne pas (ou n’est pas disponible) pour une utilisation sur les jeux de résultats IQueryable / IEnumerable …

Vous devez d’abord convertir vos résultats ToList () ou ToArray () probablement une limitation technique à la façon dont C # itère VEnumerables. Listes … Est-ce que cela a quelque chose à voir avec l’exécution différée des collections IEnumerables / IQuerable. par exemple

var userAgentSsortingngs = uasdc.UserAgentSsortingngs .Where(p => p.DeviceID == 0 && !p.UserAgentSsortingng1.Contains("msie")); //WORKS userAgentSsortingngs.ToList().ForEach(uas => ProcessUserAgentSsortingng(uas)); //WORKS Array.ForEach(userAgentSsortingngs.ToArray(), uas => ProcessUserAgentSsortingng(uas)); //Doesn't WORK userAgentSsortingngs.ForEach(uas => ProcessUserAgentSsortingng(uas)); 

Quelle coïncidence incroyable, je viens juste d’écrire un article de blog sur cette question même. Il sera publié le 18 mai . Il n’y a aucune raison technique pour laquelle nous (ou vous!) Ne pouvez pas le faire. Les raisons pour lesquelles ne sont pas philosophiques. Voir mon blog la semaine prochaine pour mon argument.

Il est parfaitement possible d’écrire une méthode d’extension ForEach pour IEnumerable .

Je ne suis pas sûr de savoir pourquoi il n’est pas inclus en tant que méthode d’extension intégrée:

  • Peut-être parce que ForEach existait déjà sur List et Array avant LINQ.
  • Peut-être parce qu’il est assez facile d’utiliser une boucle foreach pour itérer la séquence.
  • Peut-être parce que ce n’était pas assez fonctionnel / LINQy.
  • Peut-être parce que ce n’est pas une chaîne. (Il est assez facile de créer une version chaînable yield chaque élément après avoir effectué une action, mais ce comportement n’est pas particulièrement intuitif.)

 public static void ForEach(this IEnumerable source, Action action) { if (source == null) throw new ArgumentNullException("source"); if (action == null) throw new ArgumentNullException("action"); foreach (T item in source) { action(item); } }