2008-12-08 12 views
14

¿Alguien puede compartir un ejemplo simple del uso de la palabra clave foreach con objetos personalizados?Cómo utilizar la palabra clave foreach en Objetos personalizados en C#

+0

Lo que es específicamente la cuestión? ¿Cómo * usar * foreach con un objeto personalizado? ¿O cómo escribir código en el objeto personalizado para que foreach pueda usarse en él? –

+1

cómo escribir código en el objeto personalizado para que foreach se pueda usar en él – user42070

Respuesta

37

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 (generalmente) utiliza IEnumerable y IEnumerator o sus primos genéricos. Una declaración de la forma:

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

donde 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 la IEnumerator<Foo> está dispuesto en el extremo, sin embargo, las salidas de los estados. Esto es importante para los bloques de iteradores.

Para implementar IEnumerable<T> o IEnumerator<T> usted mismo, la manera más fácil es usar un bloque iterador. En lugar de escribir todos los detalles aquí, probablemente sea mejor simplemente referirlo a chapter 6 of C# in Depth, que es una descarga gratuita. Todo el capítulo 6 está sobre iteradores. Tengo otro par de artículos en mi C# en el sitio de la profundidad, también:

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 
} 

Implementar IEnumerable<T> para una escriba, 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 
    } 
} 
+0

El enlace directo de PDF se redirige a la página de dotación: quizás esto funcione mejor: http://www.manning.com/skeet/ –

+0

Gracias mucho, arreglando ahora Eso es un poco molesto :( –

6

(supongo C# aquí)

Si usted tiene una lista de objetos personalizados que sólo puede utilizar el foreach de la misma manera como lo hace con cualquier otro objeto:

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

Si desea Para 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); 
Cuestiones relacionadas