Linq style “For Each”

Duplication possible:
Linq équivalent de foreach pour IEnumerable

Existe-t-il une syntaxe de style Linq pour les opérations “For each”?

Par exemple, ajoutez des valeurs basées sur une collection à une autre, déjà existante:

IEnumerable someValues = new List() { 1, 2, 3 }; IList list = new List(); someValues.ForEach(x => list.Add(x + 1)); 

Au lieu de

 foreach(int value in someValues) { list.Add(value + 1); } 

L’utilisation de la méthode d’extension ToList () est votre meilleure option:

 someValues.ToList().ForEach(x => list.Add(x + 1)); 

Il n’y a pas de méthode d’extension dans la BCL qui implémente directement ForEach.


Bien qu’il n’y ait pas de méthode d’extension dans la BCL qui fait cela, il y a toujours une option dans l’espace de noms du System … si vous ajoutez des extensions réactives à votre projet:

 using System.Reactive.Linq; someValues.ToObservable().Subscribe(x => list.Add(x + 1)); 

Cela a le même résultat final que l’utilisation de ToList ci-dessus, mais est (en théorie) plus efficace, car elle transmet directement les valeurs au délégué.

Les classes Array et List ont déjà des méthodes ForEach , mais uniquement cette implémentation spécifique. (Notez que le premier est static , en passant).

Pas sûr que cela offre vraiment un grand avantage par rapport à une instruction foreach , mais vous pouvez écrire une méthode d’extension pour faire le travail pour tous les objects IEnumerable .

 public static void ForEach(this IEnumerable source, Action action) { foreach (var item in source) action(item); } 

Cela permettrait au code exact que vous avez posté dans votre question de fonctionner comme vous le souhaitez.

Il n’y a rien de intégré, mais vous pouvez facilement créer votre propre méthode d’extension pour le faire:

 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); } } 

La ligne MS officielle est “parce que ce n’est pas une opération fonctionnelle” (c’est une opération avec état).

Tu ne peux pas faire quelque chose comme:

 list.Select( x => x+1 ) 

ou si vous en avez vraiment besoin dans une liste:

 var someValues = new List( list.Select( x => x+1 ) ); 

Il n’y a rien de tel dans la norme Linq, mais il y a un opérateur ForEach dans MoreLinq .

Il n’y a pas d’extension Linq ForEach. Cependant, la classe List a une méthode ForEach, si vous souhaitez utiliser directement la List .

Pour ce que cela vaut, la syntaxe foreach standard vous donnera les résultats souhaités et il est probablement plus facile à lire:

 foreach (var x in someValues) { list.Add(x + 1); } 

Si vous êtes catégorique, vous voulez une extension de style Linq. c’est banal de l’implémenter vous-même.

 public static void ForEach(this IEnumerable @this, Action action) { foreach (var x in @this) action(x); }