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.