2010-04-23 19 views
13

Utilizamos for or foreach para recorrer colecciones y procesar cada entrada.Foreach/For loop alternative lambda function?

¿Hay alguna alternativa en todas las nuevas funciones lambda para colecciones en C#?

forma tradicional de hacer

foreach(var v in vs) 
{ 
    Console.write(v); 
} 

¿Hay algo como?

vs.foreach(v => console.write(v)) 
+0

posible duplicado de [LINQ equivalente de foreach para IEnumerable ] (http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet) – nawfal

Respuesta

15

La lista tiene el método ForEach, sin embargo, IEnumerable no.

Hay un número de preguntas/respuestas con respecto a esto. Creo que la razón principal por la que no se implementó en IEnumerable es que Linq en Enumerables está "destinado" a ser libre de efectos secundarios ya que es un lenguaje de consulta.

Eric Lippert explica sus pensamientos en su blog.

http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

+0

+1 para vincular al blog de Eric Lippert, donde explica por qué hacerlo de esta manera es una mala idea (y el "foreach" tradicional es en realidad mejor). –

1

lo que has escrito es perfectamente legal (aparte del caso) - suponiendo que el tipo de vsForEach ha definido como un método de extensión o si es un List.

ForEach se define para List<T>:

realiza la acción especificada en cada elemento de la List<T>.

8

Sí.

De de IList, hay un método de extensión ParaCada:

Hay un método para ParaCada lista:

List<string> list = new List<string>() { "1", "2", "3", "4" }; 

list.ForEach(s => Console.WriteLine(s)); 

es eso lo que está buscando?

+0

Para que quede claro: Es un método dentro de 'List ', es * no * un método de extensión. No tiene sentido agregar ForEach a LINQ, pero * tiene * sentido moverlo a 'IList ': Ir [aquí] (https://connect.microsoft.com/VisualStudio/feedback/details/552410/move-lots-of-helpful-methods-from-list-to-ilist-using-extension-methods) para apoyar esto! :) –

+0

Hmm, soy corregido. Siempre pensé que era una extensión de IList en lugar de un método fuera de la implementación concreta. –

+0

jeje con respecto a ** fuera de **, edité su respuesta, pero lo siento, no puedo editar su comentario, ayudarse a sí mismo :-) –

0
static void Main(string[] args) 
{ 
    int[] i = {1, 2, 3, 4, 5, 6, 7, 78, 8, 9}; 
    var data = i.ToList(); 

    data.ForEach(m => { Console.WriteLine(m); }); 

    Console.ReadKey(); 
} 
2

Por defecto, no hay uno.
Se podría definir su propio:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { 
    foreach(T val in source) 
     action(val); 
} 
0
vs.ToList().ForEach(item => Console.WriteLine(item)); 
0

.NET de LINQ no tiene Foreach 3.5, aunque LinqBridge proporcionado uno. Me acostumbré a usar Linqbridge que naturalmente assumed es parte de .NET 3.5 Marco

Sólo tiene que añadir a sus colecciones métodos de extensión si usted piensa que podría aportar claridad a su programa

static class Helper 
{ 
    public static IEnumerable<t> ForEeach<t> 
     (this IEnumerable<t> source, Action<t> act) 
    { 
     foreach (T element in source) act(element); 
     return source; 
    } 
} 
2

Eric presenta un argumento convincente excepto por el hecho de que hay una ParaCada para la Lista < T> pero solo para la lista < T>. He cometido numerosas ocasiones para usar ese método de extensión muy útil y me ha frustrado igualmente la falta de un método de extensión general para IEnumerable < T>, así que finalmente decidí escribir el mío.

De este modo, terminé yendo un paso más allá y escribir una vez < T> y forevery < T> métodos de extensión fluidas que permiten chaing de acciones sobre cada elemento y la ejecución de una acción sólo una vez en esa cadena, si no por otra razón que parecían una buena idea en ese momento.

Aquí está el código:

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

    public static IEnumerable<T> Once<T>(this IEnumerable<T> collection, 
     Func<IEnumerable<T>, bool> predicate, Action<IEnumerable<T>> action) 
    { 
     if (predicate(collection)) 
     action(collection); 
     return collection; 
    } 

    public static IEnumerable<T> ForEvery<T>(this IEnumerable<T> collection, 
     Func<T, bool> predicate, Action<T> action) 
    { 
     foreach (var item in collection) 
     { 
     if (predicate(item)) 
      action(item); 
     } 
     return collection; 
    } 
} 

Puede encontrar el código ejemplo de uso en mi blog Extend IEnumerable with ForEach and Once Methods.