Como os loops foreach funcionam em C #?

Quais tipos de classs podem usar loops foreach ?

Na verdade, estritamente falando, tudo que você precisa para usar foreach é um método público GetEnumerator() que retorna algo com um método bool MoveNext() e um ? Current {get;} Propriedade ? Current {get;} . No entanto, o significado mais comum disso é “algo que implementa IEnumerable / IEnumerable , retornando um IEnumerator / IEnumerator .

Por implicação, isso inclui qualquer coisa que implemente ICollection / ICollection , como qualquer coisa como Collection , List , arrays ( T[] ), etc. Portanto, qualquer “coleção de dados” padrão geralmente suportará .

Para prova do primeiro ponto, o seguinte funciona muito bem:

 using System; class Foo { public int Current { get; private set; } private int step; public bool MoveNext() { if (step >= 5) return false; Current = step++; return true; } } class Bar { public Foo GetEnumerator() { return new Foo(); } } static class Program { static void Main() { Bar bar = new Bar(); foreach (int item in bar) { Console.WriteLine(item); } } } 

Como funciona?

Um loop foreach como foreach(int i in obj) {...} equivalente a:

 var tmp = obj.GetEnumerator(); int i; // up to C# 4.0 while(tmp.MoveNext()) { int i; // C# 5.0 i = tmp.Current; {...} // your code } 

No entanto, existem variações. Por exemplo, o enumerador (tmp) suporta IDisposable , é usado também (semelhante ao using ).

Observe a diferença no posicionamento da declaração ” int identro (C # 5.0) versus fora (up C # 4.0) o loop. É importante se você usar i em um método anônimo / lambda dentro do seu bloco de código. Mas isso é outra história;

Do MSDN :

A instrução foreach repete um grupo de instruções incorporadas para cada elemento em uma matriz ou coleção de objects . A instrução foreach é usada para percorrer a coleção para obter as informações desejadas, mas não deve ser usada para alterar o conteúdo da coleção para evitar efeitos colaterais imprevisíveis. (ênfase minha)

Então, se você tem uma matriz, você poderia usar a declaração foreach para percorrer a matriz, da seguinte forma:

  int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 }; foreach (int i in fibarray) { System.Console.WriteLine(i); } 

Você também pode usá-lo para percorrer uma coleção List , assim:

 List list = new List(); foreach (string item in list) { Console.WriteLine(item); } 

De acordo com o post no blog Duck Notation , é usada a tipagem de pato.

Aqui estão os documentos: Artigo principal com matrizes com objects de coleção

É importante observar que “O tipo do elemento da coleção deve ser conversível para o tipo de identificador”. Isso às vezes não pode ser verificado em tempo de compilation e pode gerar uma exceção de tempo de execução se o tipo de instância não puder ser atribuído ao tipo de referência.

Isso gerará uma exceção de tempo de execução se houver uma não Apple na cesta de frutas, como uma laranja.

 List fruitBasket = new List() { new Apple(), new Orange() }; foreach(Apple a in fruitBasket) 

Isso filtra com segurança a lista apenas para as maçãs usando Enumerable.OfType

 foreach(Apple a in fruitBasket.OfType() ) 

Foreach loop e como itera sobre IEnumerable sob o capô.

Referência C # Foreach Exemplos

 IList illi = new List(); ListItem li = null; foreach (HroCategory value in listddlsubcategory) { listddlsubcategoryext = server.getObjectListByColumn(typeof(HroCategory), "Parentid", value.Id); li = new ListItem(); li.Text = value.Description; li.Value = value.Id.ToString(); illi.Add(li); IList newilli = new List(); newilli = SubCatagoryFunction(listddlsubcategoryext, "-->"); foreach (ListItem c in newilli) { illi.Add(c); } } 

Informações úteis sobre este assunto podem ser encontradas no MSDN também. Tomando a essência desse artigo:

A palavra-chave foreach enumera uma coleção, executando a instrução incorporada uma vez para cada elemento na coleção:

 foreach (var item in collection) { Console.WriteLine(item.ToString()); } 

O compilador traduz o loop foreach mostrado no exemplo acima em algo semelhante a esta construção:

 IEnumerator enumerator = collection.GetEnumerator(); while (enumerator.MoveNext()) { var item = enumerator.Current; Console.WriteLine(item.ToString()); } 

você pode tentar isso …

 List numbers = new List(); numbers.Add(5); numbers.Add(15); numbers.Add(25); numbers.Add(35); Console.WriteLine("You are added total number: {0}",numbers.Count); foreach (int number in numbers) { Console.WriteLine("Your adding Number are: {0}", number); }