251 votes

C #: style Linq "pour chaque"

Dupliquer possible:
Linq équivalent de foreach pour IEnumerable

Existe-t-il une syntaxe de style linq pour les opérations "Pour chaque"?

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

 IEnumerable<int> someValues = new List<int>() { 1, 2, 3 };
IList<int> list = new List<int>();

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

Au lieu de

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

350voto

Mark Seemann Points 102767

À l'aide de la ToList() la méthode d'extension est votre meilleure option:

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

Il n'existe pas de méthode d'extension de la BCL qui implémente ForEach directement.


Bien qu'il n'y a aucune méthode d'extension dans la BCL qui fait cela, il est toujours une option dans l' System de l'espace de noms... si vous ajoutez Réactif Extensions à votre projet:

using System.Reactive.Linq;

someValues.ToObservable().Subscribe(x => list.Add(x + 1));

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

125voto

Noldorin Points 67794

L' Array et List<T> des classes ont déjà ForEach méthodes, bien que cette mise en œuvre spécifique. (À noter que l'ancien est - static, par la voie).

Pas sûr qu'il offre vraiment un grand avantage par rapport à un foreach déclaration, mais vous pourriez écrire une extension de la méthode pour faire le travail pour tous, IEnumerable<T> objets.

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

Cela permettrait le code exact où vous avez posté votre question de travailler comme vous le souhaitez.

37voto

LukeH Points 110965

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

21voto

stusmith Points 8588

La ligne officielle de MS est « parce qu’il n’est pas une opération fonctionnelle » (c’est à dire, c’est une opération dynamique).

Si vous ne pouvait pas faire quelque chose comme :

ou si vous le désirez vraiment dans une liste :

4voto

Il n’y a rien comme ça dans Linq standard, mais il y a un opérateur ForEach dans MoreLinq.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X