recorrer for array c# .net foreach

for - iterate array c#



¿Cómo funciona foreach cuando se recorren los resultados de la función? (4)

GetMyStrings () retorna un objeto de tipo IEnumerable. El tiempo de ejecución sabe cómo lidiar con eso. Llama a IEnumerable.GetEnumerator () y luego en ese objeto del enumerador se llama MoveNext () y Current.

Supongamos que tengo el siguiente código:

foreach(string str in someObj.GetMyStrings()) { // do some stuff }

¿Se someObj.GetMyStrings() en cada iteración del bucle? Sería mejor hacer lo siguiente:

List<string> myStrings = someObj.GetMyStrings(); foreach(string str in myStrings) { // do some stuff }

?


La función solo se llama una vez, para devolver un IEnumerator<T> ; después de eso, el método MoveNext() y la propiedad Current se utilizan para iterar a través de los resultados:

foreach (Foo f in GetFoos()) { // Do stuff }

es algo equivalente a:

using (IEnumerator<Foo> iterator = GetFoos().GetEnumerator()) { while (iterator.MoveNext()) { Foo f = iterator.Current; // Do stuff } }

Tenga en cuenta que el iterador está dispuesto al final, esto es particularmente importante para disponer los recursos de los bloques de iteradores, por ejemplo:

public IEnumerable<string> GetLines(string file) { using (TextReader reader = File.OpenText(file)) { string line; while ((line = reader.ReadLine()) != null) { yield return line; } } }

En el código anterior, realmente desea que el archivo se cierre cuando termine de iterar, y el compilador implementa IDisposable astutamente para hacer que funcione.


No ... la función se llamará una vez para obtener IEnumerable ... y luego se repetirá la llamada a MoveNext y Current.


Solo para redondear la pregunta en caso de que caigas en un "todos los por son iguales"; para (int x = 0; x <ProveeCeiling (); x ++) llama a la función cada vez.