foreach ou ForEach

Outro dia saiu uma pergunta numa lista de discussão, sobre o que era melhor usar, For, foreach ou ainda ForEach?

Histórinha do ForEach: Depois dos Generics, disponibilizado no framework 2.0, se tornou comum o uso de listas tipadas, muito melhores que o uso de Arrays de Objects! Também foi introduzido os tipos anônimos, expressões Lambda. Em seguida na versão 3.5 do framework foi introduzido o Linq, mudando a forma como são manipuladas coleções de objetos.

Se é necessário somar o valor dos itens de uma nota fiscal o modo “old school” é:

[code lang=”csharp”]

List itens = new List();

itens.Add(new Item() { Valor = 10.3M });

itens.Add(new Item() { Valor = 11.7M });

itens.Add(new Item() { Valor = 15.8M });

decimal valorTotal = 0;

foreach (Item item in itens)

{

valorTotal += item.Valor;

}

[/code]

Ou você pode fazer:

[code lang=”csharp”]

List itens = new List();

itens.Add(new Item() { Valor = 10.3M });

itens.Add(new Item() { Valor = 11.7M });

itens.Add(new Item() { Valor = 15.8M });

decimal valorTotal = 0;

itens.ForEach(item => valorTotal += item.Valor);

[/code]

Mas fora a diferença de sintaxe, existe alguma outra? Performance? E o que é esse método ForEach?

ForEach é um método que recebe como parâmetro um delegate Action, ou seja ele recebe uma função a ser executada, nesse caso será executado um foreach!! Sem emoção aqui, mas o legal é que percorrer uma coleção fazendo alguma alteração em seus itens agora requer apenas uma linha.

Mas não é só isso! Voltando a nossa questão de performance o ForEach é mais otimizado sim, eu ia fazer um pequeno projeto de teste mas… achei um post falando justamente sobre isso, então para reaproveitar código quem quiser testar é só usar o projeto que foi disponibilizado pelo Dustin Russell Campbell aqui neste post. A comparação é bem completa, usando vários tipos de interação (For, foreach, ForEach), e o ForEach ganha! Somente quando o código esta usando otimização na compilação com uma coleção pequena a velocidade se equipara, mas a medida que a quantidade de itens aumenta ele é mais rápido que outros métodos.

A quem não goste

Encontrei também comentários de pessoas que não gostam dessa abordagem, dizendo que ela não adiciona poder representativo a linguagem, o exemplo dado no link é bem simples então o autor tem razão. Porém minha opinião é que o código fica muito mais legível, tornando a leitura mais fluída.

Compartilhar