ventajas expresiones español ejemplos aprender c# .net-3.5 lambda foreach

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 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); } }