Tuvimos algunos códigos aquí (en VS2005 y C# 2.0) donde los ingenieros anteriores hicieron todo lo posible para usar list.ForEach(delegate(item) { foo;});
en lugar de foreach(item in list) {foo; };
para todo el código que escribieron. p.ej. un bloque de código para leer filas de un lector de datos.
Todavía no sé exactamente por qué lo hicieron.
Los inconvenientes de list.ForEach()
son:
Es más detallado en C 2,0 #. Sin embargo, en C# 3 en adelante, puede usar la sintaxis "=>
" para hacer algunas expresiones muy lacras.
Es menos familiar. Las personas que tienen que mantener este código se preguntarán por qué lo hiciste de esa manera. Me tomó un tiempo decidir que no había ninguna razón, excepto tal vez para hacer que el escritor pareciera inteligente (la calidad del resto del código lo socavó). También fue menos legible, con el "})
" al final del bloque de código de delegado.
Vea también el libro de Bill Wagner "Effective C#: 50 Formas específicas para mejorar su C#" donde explica por qué foreach es preferible a otros bucles como for o while - el punto principal es dejar que el compilador decida la mejor forma de construir el ciclo Si una versión futura del compilador logra usar una técnica más rápida, la obtendrá de forma gratuita utilizando foreach y reconstrucción, en lugar de cambiar su código.
una construcción foreach(item in list)
le permite utilizar break
o continue
si tiene que salir de la iteración o el bucle. Pero no puedes alterar la lista dentro de un ciclo foreach.
Me sorprende ver que list.ForEach
es un poco más rápido. Pero esa no es una razón válida para usarla en todo momento, sería una optimización prematura. Si su aplicación utiliza una base de datos o servicio web que, no control de bucle, casi siempre va a estar donde el tiempo lo permita. ¿Y lo ha comparado con un lazo for
también? El list.ForEach
podría ser más rápido debido al uso interno y un bucle for
sin el envoltorio sería aún más rápido.
No estoy de acuerdo con que la versión list.ForEach(delegate)
sea "más funcional" de manera significativa. Transfiere una función a una función, pero no hay una gran diferencia en el resultado o la organización del programa.
No creo que foreach(item in list)
"dice exactamente cómo quiere que se haga" - un bucle for(int 1 = 0; i < count; i++)
hace eso, un bucle foreach
deja la elección del control hasta el compilador.
Mi sensación es, en un nuevo proyecto, para usar foreach(item in list)
para la mayoría de los bucles con el fin de cumplir con el uso común y para facilitar la lectura, y el uso de list.Foreach()
sólo para bloques cortos, cuando se puede hacer algo más elegante o de forma compacta con el C# 3 "=>
" operador. En casos como ese, es posible que ya exista un método de extensión LINQ que sea más específico que ForEach()
. Vea si Where()
, Select()
, Any()
, All()
, Max()
o uno de los muchos otros métodos LINQ ya no hace lo que desea del ciclo.
Sugiero leer [Eric Lipperts blog "foreach" vs "ForEach"] (http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx) –