Dupliquer possible:
Linq équivalent de foreach pour IEnumerableExiste-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); }
- Équivalent LINQ de foreach pour IEnumerable<T> (5 réponses )
Réponses
Trop de publicités?À 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é.
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.
Il n’y a rien comme ça dans Linq standard, mais il y a un opérateur ForEach dans MoreLinq.