array c# foreach

array - foreach var c#



Cómo usar la palabra clave foreach en Objetos personalizados en C# (2)

¿Alguien puede compartir un ejemplo simple del uso de la palabra clave foreach con objetos personalizados?


(Supongo C # aquí)

Si tiene una lista de objetos personalizados, puede usar el foreach de la misma forma que lo hace con cualquier otro objeto:

List<MyObject> myObjects = // something foreach(MyObject myObject in myObjects) { // Do something nifty here }

Si desea crear su propio contenedor, puede usar la palabra clave yield (desde .Net 2.0 y hacia arriba, creo) junto con la interfaz IEnumerable.

class MyContainer : IEnumerable<int> { private int max = 0; public MyContainer(int max) { this.max = max; } public IEnumerator<int> GetEnumerator() { for(int i = 0; i < max; ++i) yield return i; } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }

Y luego usarlo con foreach:

MyContainer myContainer = new MyContainer(10); foreach(int i in myContainer) Console.WriteLine(i);


Dadas las etiquetas, supongo que te refieres a .NET, y elegiré hablar sobre C #, ya que eso es lo que sé.

La declaración foreach (por lo general) usa IEnumerable e IEnumerator o sus primos genéricos. Una declaración de la forma:

foreach (Foo element in source) { // Body }

donde la source implementa IEnumerable<Foo> es más o menos equivalente a:

using (IEnumerator<Foo> iterator = source.GetEnumerator()) { Foo element; while (iterator.MoveNext()) { element = iterator.Current; // Body } }

Tenga en cuenta que IEnumerator<Foo> está dispuesto al final, sin embargo, la declaración se cierra. Esto es importante para los bloques de iteradores.

Para implementar IEnumerable<T> o IEnumerator<T> usted mismo, la forma más fácil es usar un bloque iterador. En lugar de escribir todos los detalles aquí, probablemente sea mejor que lo remita al capítulo 6 de C # en profundidad , que es una descarga gratuita. Todo el capítulo 6 está sobre iteradores. También tengo otros dos artículos en mi sitio C # en profundidad:

Como un ejemplo rápido, sin embargo:

public IEnumerable<int> EvenNumbers0To10() { for (int i=0; i <= 10; i += 2) { yield return i; } } // Later foreach (int x in EvenNumbers0To10()) { Console.WriteLine(x); // 0, 2, 4, 6, 8, 10 }

Para implementar IEnumerable<T> para un tipo, puede hacer algo como:

public class Foo implements IEnumerable<string> { public IEnumerator<string> GetEnumerator() { yield return "x"; yield return "y"; } // Explicit interface implementation for nongeneric interface IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); // Just return the generic version } }