2012-02-26 5 views
13

Questa è la mia classeCome si effettua una classe iterabile?

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

voglio fare quella classe iterabile da utilizzare come il modo di sotto

foreach (int irVal in myVarWordSimilarity) 
{ 

} 

myVarWordSimilarity è csWordSimilarity tipo. Quindi voglio ripetere tutte le variabili pubbliche int. Come devo modificare la classe csWordSimilarity per renderla iterabile come sopra.

+1

c'è un motivo per cui non dovrebbe usare '' Lista ? In caso affermativo, esaminare Implementing IEnumerable. –

+0

Si prega di non aggiungere "C#" e tali ai vostri titoli. Ecco a cosa servono i tag. –

+0

Riferimento: [Come utilizzare il ciclo foreach con oggetti personalizzati] (http://stackoverflow.com/a/348977/1004522). Passa attraverso questo e ti aiuterà anche a capire l'utilizzo ogni volta che vuoi. –

risposta

21

è possibile implementare IEnumerable e hanno l'override GetEnumerator restituisce un "iteratore" sopra le variabili utilizzando il yield dichiarazione

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

grazie mille per la risposta anche se la tua soluzione dando errore "Utilizzando il tipo generico" System.Collections.Generic.IEnumerator 'richiede 1 tipo argomenti " – MonsterMMORPG

+1

Quale versione di .NET stai usando? Non riesco a pensare a un modo per replicare tale errore dal momento che .NET 4 consente di omettere la definizione del tipo di modello in modo che diventi un IEnumerable edvaldig

8

Implementare IEnumerable. Vedere Using Iterators (C# Programming Guide)

Nel tuo caso si potrebbe utilizzare l'iteratore built-in di un List in questo modo:

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

C'è un notevole sovraccarico nell'istanziazione di una nuova istanza di List al solo scopo di restituire un enumeratore di esso, l'istruzione yield semplifica questo ed è più ottimale. – edvaldig

+0

@edvaldig Penso che sia una questione di preferenza. Se lo chiamerai milioni di volte, allora usa il diretto 'yield'. Altrimenti preferisco usare le classi BCL e soprattutto 'List' dove conveniente. –

+0

sì, ho intenzione di usarlo milioni di volte :) Grazie per heads up edvaldig – MonsterMMORPG