2012-02-26 10 views
13

To moja klasaJak zrobić klasę iterowalną?

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

chcę uczynić tę klasę iterable być używany jak sposób poniżej

foreach (int irVal in myVarWordSimilarity) 
{ 

} 

myVarWordSimilarity jest csWordSimilarity typu. Dlatego chcę powtórzyć wszystkie publiczne zmienne int. Jak muszę zmodyfikować klasę csWordSimilarity, aby była możliwa do iteracji tak jak powyżej.

+1

Czy istnieje powód, dla którego nie użyłbyś 'List '? Jeśli tak, to spójrz na implementację IEnumerable. –

+0

Nie dodawaj "C#" i podobnych do swoich tytułów. Po to są te tagi. –

+0

Odniesienie: [Jak korzystać z pętli foreach z obiektami niestandardowymi] (http://stackoverflow.com/a/348977/1004522). Przejdź przez to i pomoże ci to zrozumieć sposób użycia, kiedy tylko chcesz. –

Odpowiedz

21

można zaimplementować IEnumerable i mają nadpisanie GetEnumerator zwraca „iterator” nad zmiennymi uzywajac yield oświadczenie

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

dziękuję za odpowiedź, chociaż Twoje rozwiązanie daje błąd "Korzystanie z ogólnego typu" System.Collections.Generic.IEnumerator "wymaga 1 argumentów typu" – MonsterMMORPG

+1

Którą wersję .NET używasz? Nie mogę wymyślić sposobu na zreplikowanie tego błędu, ponieważ .NET 4 pozwala pominąć definicję typu szablonu, dzięki czemu stanie się niezliczoną liczbą edvaldig

8

Implementacja IEnumerable. Zobacz Using Iterators (C# Programming Guide)

W twoim przypadku można po prostu użyć wbudowanego iterator o List tak:

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

Występuje znaczny narzut w tworzeniu instancji nowej listy wyłącznie w celu zwrócenia jej modułu wyliczającego, instrukcja zysku upraszcza to i jest bardziej optymalna. – edvaldig

+0

@edvaldig Myślę, że to kwestia preferencji. Jeśli zamierzasz to nazwać miliony razy, to tak, używaj bezpośredniego zwrotu. W przeciwnym razie preferuję używanie klas BCL, a zwłaszcza 'List' gdzie jest to wygodne. –

+0

Tak, zamierzam użyć tego miliony razy :) Dzięki za heads up edvaldig – MonsterMMORPG