Expressão Lambda usando Cláusula Foreach

Duplicar Possível:
Por que não há um método de extensão ForEach na interface IEnumerable?

EDITAR

Para referência, aqui está a postagem do blog com a qual eric se referiu nos comentários

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

ORIG

Mais uma curiosidade, suponho, mas um para o C # Specification Savants …

Por que é que a cláusula ForEach () não funciona (ou não está disponível) para uso em conjuntos de resultados IQueryable / IEnumerable …

Você tem que primeiro converter seus resultados ToList () ou ToArray () Presumivelmente, há uma limitação técnica para a maneira como C # itera IEnumerables vs. Listas … É algo a ver com a Execução Adiada de Coleções IEnumerables / IQuerable. por exemplo

var userAgentStrings = uasdc.UserAgentStrings .Where(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)); 

Que incrível coincidência, eu acabei de escrever um artigo no blog sobre essa questão. Será publicado em 18 de maio . Não há nenhuma razão técnica pela qual nós (ou você!) Não pudéssemos fazer isso. As razões porque não são filosóficas. Veja meu blog na próxima semana para o meu argumento.

É perfeitamente possível escrever um método de extensão ForEach para IEnumerable .

Não sei ao certo por que ele não está incluído como um método de extensão interno:

  • Talvez porque ForEach já existia em List e Array antes do LINQ.
  • Talvez porque seja fácil usar um loop foreach para iterar a sequência.
  • Talvez porque não foi considerado funcional / LINQy o suficiente.
  • Talvez porque não seja de cadeia. (É bastante fácil criar uma versão em cadeia que yield cada item após executar uma ação, mas esse comportamento não é particularmente intuitivo.)

 public static void ForEach(this IEnumerable source, Action action) { if (source == null) throw new ArgumentNullException("source"); if (action == null) throw new ArgumentNullException("action"); foreach (T item in source) { action(item); } }