Se você ainda fica um pouco confuso quando deve usar um for/next ou um foreach neste artigo vamos comparar essas duas estruturas de repetições usadas para iterar sobre itens e coleções. |
Neste artigo vamos comparar as estruturas de repetição 'for' e 'foreach' tanto no quesito de funcionamento básico como no desempenho focando na iteração de listas ou coleções.
Laço For
A instrução for executa uma instrução ou um bloco de instruções enquanto uma expressão booleana especificada é avaliada como true, ou seja, ou seja, o laço for itera até que uma condição seja verdadeira.
Você fornece uma instrução inicial (inicializador), uma condição para a qual o laço deve ser iterado até que ele seja falso, um iterador, e, uma instrução que será executada após cada execução bem-sucedida do bloco.
A estrutura da instrução for é a seguinte:
for (inicializador; condição;
iterador) instrução |
Um exemplo básico e padrão para um laço for seria:
for (int index = 1; index < 10;
index++) { Console.WriteLine(index) } |
Um exemplo de código usando uma coleção ou lista seria:
using System;
using System.Collections.Generic;
namespace CSharp_For1
{
class Aluno
{
public string Nome { get; set; }
public int Idade { get; set; }
public static List<Aluno> GetAlunos()
{
List<Aluno> alunos = new List<Aluno>();
alunos.Add(new Aluno { Nome = "Pedro", Idade = 20 });
alunos.Add(new Aluno { Nome = "Maria", Idade = 18 });
return alunos;
}
}
class Program { static void Main(string[] args) { List<Aluno> lista = Aluno.GetAlunos(); for (int index = 0; index < lista.Count; index++) { Console.WriteLine(lista[index].Nome); } } } } |
Observe que podemos acessar diretamente o item da lista pelo seu índice. ( lista[index].Nome )
Laço Foreach
A instrução foreach
executa uma instrução ou um bloco de instruções para cada elemento em uma
instância do tipo que implementa a interface
System.Collections.IEnumerable ou
System.Collections.Generic.IEnumerable<T>.
A instrução foreach não está limitada a esses tipos e pode ser aplicada a uma
instância de qualquer tipo que satisfaça as seguintes condições:
1
- Incluir um método GetEnumerator público sem
parâmetros, cujo tipo de retorno é um tipo de classe, estrutura ou interface;
2
- O tipo de retorno do método GetEnumerator tem a
propriedade Current pública e o método
MoveNext público sem parâmetros, cujo tipo de
retorno é Boolean.
De forma geral a instrução Foreach é usada para iterar sobre itens em uma coleção (List, Arrays, etc,)
Usando o mesmo exemplo anterior para o laço foreach para iterar sobre uma lista temos:
using System;
using System.Collections.Generic;
namespace CSharp_For1
{
class Aluno
{
public string Nome { get; set; }
public int Idade { get; set; }
public static List<Aluno> GetAlunos()
{
List<Aluno> alunos = new List<Aluno>();
alunos.Add(new Aluno { Nome = "Pedro", Idade = 20 });
alunos.Add(new Aluno { Nome = "Maria", Idade = 18 });
return alunos;
}
}
class Program
{
static void Main(string[] args)
{
var alunos = Aluno.GetAlunos();
foreach (Aluno aluno in alunos)
{
Console.WriteLine(aluno.Nome);
}
Console.ReadLine();
}
}
}
|
Esse código esconde alguns segredos.
O laço foreach cria uma cópia da coleção na qual estamos iterando e isso significa que se você desejar realizar uma atribuição em um item da coleção não vai poder fazer isso diretamente.
Para deixar mais claro veja este exemplo :
Como foreach cria uma cópia da coleção, o elemento 'item' não esta referenciando os elementos do array, ele é apenas uma variável temporária e não podemos atribuir um valor a ele.
A conclusão é que em termos de desempenho o laço foreach é mais lento que um laço for pois ele usa mais memória e usa os métodos GetEnumerator() e Next().
Para acessar coleções a sintaxe do foreach é mais legível, limpa e menos sucetível a erros, mas na maioria dos cenários o laçor for é mais rápido.
É claro que na vida real os cenários podem ser mais complexos e a escolha pode ser diferente. Se você precisar do índice do item que esta sendo iterado, até o momento o foreach não te fornece o índice, mas o for oferece.
E se o que você esta iterando não for uma coleção então o laço for é mais indicado pois esta fazendo uma contagem sendo mais rápido.
E estamos conversados...
"Bom é louvar ao SENHOR, e cantar louvores ao teu
nome, ó Altíssimo;
Para de manhã anunciar a tua benignidade, e todas as noites a tua fidelidade;"
Salmos 92:1,2
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
C# - Sintaxe e conceitos básicos - Macoratti
C# - Tratando com Coleções - Macoratti
C# - LINQ : Prefira usar a sintaxe de consulta a loops - Macoratti
C# - Iterando através de uma enumeração - Macoratti
C# - Para que serve a palavra reservada 'yield' - Macoratti