update new net multiple create actions c# .net linq foreach

c# - new - linq foreach multiple actions



Estilo de Linq "para cada uno" (6)

Posible duplicado:
Linq equivalente de foreach para IEnumerable

¿Hay alguna sintaxis de estilo Linq para las operaciones "Para cada"?

Por ejemplo, agregue valores basados ​​en una colección a otra, ya existente:

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

En lugar de

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


La línea oficial de MS es "porque no es una operación funcional" (es decir, es una operación con estado).

¿No podrías hacer algo como esto?

list.Select( x => x+1 )

o si realmente lo necesitas en una lista:

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


Las clases Array y List<T> ya tienen métodos ForEach , aunque solo esta implementación específica. (Tenga en cuenta que el primero es static , por cierto).

No estoy seguro de que realmente ofrezca una gran ventaja sobre un enunciado foreach , pero podría escribir un método de extensión para hacer el trabajo para todos los IEnumerable<T> .

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

Esto permitiría que el código exacto que publicó en su pregunta funcione tal como lo desea.


No hay nada como eso en Linq estándar, pero hay un operador MoreLinq en MoreLinq .


No hay nada incorporado, pero puede crear fácilmente su propio método de extensión para hacerlo:

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


No hay una extensión Linq ForEach. Sin embargo, la clase List tiene un método ForEach en ella, si está dispuesto a usar la List directamente.

Por lo que vale, la sintaxis foreach estándar le dará los resultados que desea y probablemente sea más fácil de leer:

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

Si es inflexible, quiere una extensión de estilo Linq. es trivial implementar esto usted mismo.

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


Usar el método de extensión ToList () es su mejor opción:

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

No hay un método de extensión en el BCL que implemente ForEach directamente.

Aunque no existe un método de extensión en el BCL que hace esto, todavía hay una opción en el espacio de nombres del System ... si agrega extensiones reactivas a su proyecto:

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

Esto tiene el mismo resultado final que el uso anterior de ToList , pero es (en teoría) más eficiente, ya que transmite los valores directamente al delegado.