c# ventajas Expresión lambda utilizando la cláusula Foreach




where lambda c# (2)

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.

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 en List<T> y Array 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);
    }
}




foreach