c# - español - ventajas expresiones lambda
Expresión lambda utilizando la cláusula Foreach (2)
Posible duplicado:
¿Por qué no hay un método de extensión ForEach en la interfaz IEnumerable?
EDITAR
Como referencia, aquí está la publicación del blog a la que eric se refiere en los comentarios
http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
ORIG
Más de una curiosidad, supongo, pero una para los Savants de especificación de C # ...
¿Por qué la cláusula ForEach () no funciona (o no está disponible) para su uso en conjuntos de resultados IQueryable / IEnumerable ...
Primero tiene que convertir sus resultados ToList () o ToArray () Presumiblemente hay una limitación técnica en la forma en que C # itera IEnumerables vs. Listas ... ¿Tiene algo que ver con Ejecución diferida de IEnumerables / IQuerable Collections? p.ej
var userAgentStrings = uasdc.UserAgentStrings
.Where<UserAgentString>(p => p.DeviceID == 0 &&
!p.UserAgentString1.Contains("msie"));
//WORKS
userAgentStrings.ToList().ForEach(uas => ProcessUserAgentString(uas));
//WORKS
Array.ForEach(userAgentStrings.ToArray(), uas => ProcessUserAgentString(uas));
//Doesn''t WORK
userAgentStrings.ForEach(uas => ProcessUserAgentString(uas));
Es perfectamente posible escribir un método de extensión IEnumerable<T>
para IEnumerable<T>
.
No estoy muy seguro de por qué no está incluido como un método de extensión integrado:
- Tal vez porque
ForEach
ya existía enList<T>
yArray
antes de LINQ. - Tal vez porque es bastante fácil usar un ciclo
foreach
para iterar la secuencia. - Tal vez porque no se sentía funcional / LINQy suficiente.
- Tal vez porque no es encadenable. (Es bastante fácil hacer una versión encadenable que rinda cada artículo después de realizar una acción, pero ese comportamiento no es particularmente intuitivo).
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);
}
}
Qué sorprendente coincidencia, acabo de escribir un artículo de blog sobre esta misma pregunta. Será http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx . No hay ninguna razón técnica por la que nosotros (¡o usted!) No podamos hacer esto. Las razones por las cuales no son filosóficas. Ver mi blog la próxima semana para mi argumento.