Estilo Linq "Para cada uno" [duplicado]
¿Existe 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);
}
Usar el método de extensión ToList() es su mejor opción:
someValues.ToList().ForEach(x => list.Add(x + 1));
No existe ningún método de extensión en BCL que implemente ForEach directamente.
Aunque no hay ningún método de extensión en BCL que haga esto, todavía hay una opción en el System
espacio de nombres... 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 porque transmite los valores directamente al delegado.
Las clases Array
y List<T>
ya tienen ForEach
métodos, 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 una foreach
declaración, pero podría escribir un método de extensión para hacer el trabajo para todos IEnumerable<T>
los objetos.
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 integrado, pero puedes crear fácilmente tu 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);
}
}