2012-02-26 1 views
13

これは私がクラスを反復可能にするにはどうすればよいですか?

foreach (int irVal in myVarWordSimilarity) 
{ 

} 

myVarWordSimilarity以下の方法がcsWordSimilarityタイプであるように使用することが、そのクラスは、反復可能なようにしたい

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

私のクラスです。だから私はすべてのパブリックint変数を繰り返したいと思う。上記のように反復可能にするために、どのようにcsWordSimilarityクラスを変更する必要がありますか?

+1

「リスト」を使用しない理由はありますか?はいの場合は、IEnumerableの実装を見てください。 –

+0

タイトルに「c#」などを追加しないでください。それがタグのためのものです。 –

+0

リファレンス:[カスタムオブジェクトでforeachループを使用する方法](http://stackoverflow.com/a/348977/1004522)これを実行すると、いつでも使い方を理解するのに役立ちます。 –

答えて

21

あなたがIEnumerableを実装し、GetEnumeratorメソッドのオーバーライドが使用して変数の上に「イテレータ」を返すことができます:あなたはちょうどそうようListの組み込みのイテレータを使用することができ、あなたの場合はUsing Iterators (C# Programming Guide)

を参照してください。 yieldステートメント

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

あなたのソリューションはエラーを出してくれてありがとうございました "ジェネリックタイプ 'System.Collections.Generic.IEnumeratorを使用しました '1つの型引数が必要です。 " – MonsterMMORPG

+1

使用している.NETのバージョンはどれですか? .NET 4ではテンプレート型定義を省略してIEnumerable になるので、このエラーを再現する方法は考えられません – edvaldig

8

IEnumerableを実装します。

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

新しいListインスタンスを列挙子を返す唯一の目的でインスタンス化する際に相当なオーバーヘッドがあります。yield文はこれを単純化し、より最適です。 – edvaldig

+0

@edvaldig私はそれが好みの問題だと思う。この何百万回も呼ぶつもりなら、はい、直接の「利回り」を使います。それ以外の場合は、BCLクラス、特に便利な場合は 'List'を使用する方が好きです。 –

+0

はい私はそれを何百回も使用しようとしています:)ヘッドアップありがとうedvaldig – MonsterMMORPG