2012-02-26 15 views
13

Ésta es mi clase¿Cómo puedo hacer una clase iterable?

public class csWordSimilarity 
{ 
    public int irColumn1 = 0; 
    public int irColumn2 = 0; 
    public int irColumn3 = 0; 
    public int irColumn4 = 0; 
    public int irColumn5 = 0; 
} 

Quiero hacer esa clase iterable para ser utilizado como la forma de abajo

foreach (int irVal in myVarWordSimilarity) 
{ 

} 

myVarWordSimilarity es csWordSimilarity tipo. Por lo tanto, quiero iterar todas las variables públicas int. ¿Cómo debo modificar la clase csWordSimilarity para hacerla iterable como se muestra arriba?

+1

¿Hay alguna razón por la que no usaría 'List '? En caso afirmativo, mire la implementación de IEnumerable. –

+0

No agregue "C#" y tal a sus títulos. Para eso son las etiquetas. –

+0

Referencia: [Cómo utilizar el bucle foreach con objetos personalizados] (http://stackoverflow.com/a/348977/1004522). Repase esto y también lo ayudará a comprender el uso cuando lo desee. –

Respuesta

21

que se pueden implementar IEnumerable y tienen la anulación GetEnumerator devuelve un "repetidor" sobre las variables utilizando el yield instrucción

class csWordSimilarity : IEnumerable<int> 
{ 
    private int _var1 = 1; 
    private int _var2 = 1; 
    private int _var3 = 1; 
    private int _var4 = 1; 

    public IEnumerator<int> GetEnumerator() 
    { 
     yield return _var1; 
     yield return _var2; 
     yield return _var3; 
     yield return _var4; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
+0

muchas gracias por la respuesta, aunque su solución da error "Usando el tipo genérico 'System.Collections.Generic.IEnumerator 'requiere 1 tipo de argumentos " – MonsterMMORPG

+1

¿Qué versión de .NET estás usando? No puedo pensar en una forma de replicar ese error ya que .NET 4 le permite omitir la definición del tipo de plantilla para que se convierta en un IEnumerable edvaldig

8

Implemento IEnumerable. Ver Using Iterators (C# Programming Guide)

En su caso, sólo podría utilizar el repetidor integrado de un List así:

using System; 
using System.Collections.Generic; 

class csWordSimilarity : IEnumerable<int> { 
    public int irColumn1 = 0; 
    public int irColumn2 = 0; 
    public int irColumn3 = 0; 
    public int irColumn4 = 0; 
    public int irColumn5 = 0; 

    public IEnumerator<int> GetEnumerator() { 
     return (new List<int>() { 
      irColumn1, irColumn2, irColumn3, irColumn4, irColumn5 
     }).GetEnumerator(); 
    } 
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { 
     return GetEnumerator(); 
    } 
} 
+0

Existe una sobrecarga considerable al crear una nueva instancia de Lista con el único propósito de devolver un enumerador de la misma, la declaración de rendimiento simplifica esto y es más óptima. – edvaldig

+0

@edvaldig Creo que es una cuestión de preferencia. Si va a llamar esto millones de veces, entonces sí use el 'rendimiento 'directo. De lo contrario, prefiero usar las clases BCL y especialmente 'List' cuando sea conveniente. –

+0

sí lo voy a usar millones de veces :) Gracias por la cabeza edvaldig – MonsterMMORPG

Cuestiones relacionadas