Estilo Linq "Para cada uno" [duplicado]

Resuelto Stefan Steinegger asked hace 15 años • 6 respuestas

¿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);
}
Stefan Steinegger avatar Oct 02 '09 20:10 Stefan Steinegger
Aceptado

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 Systemespacio 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.

Mark Seemann avatar Oct 02 '2009 13:10 Mark Seemann

Las clases Arrayy List<T>ya tienen ForEachmé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 foreachdeclaració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.

Noldorin avatar Oct 02 '2009 13:10 Noldorin

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);
    }
}
LukeH avatar Oct 02 '2009 13:10 LukeH