2012-03-01 8 views
3

コレクション内でコレクションList<T>またはarraylistを使用している場合は、IEnumerableを実装して列挙子を返すだけで独自の列挙型クラスを作成する必要があります。私は、人々が独自の列挙型クラスを作成し、現在のmovenextなどを実装するオンラインの例を参照しています。独自のIEnumerableクラスを作成する場合

+0

オンラインで見つかった例は、C#でサポートされているイテレータブロックより前に記述されている可能性があります。 – phoog

答えて

7

コレクションクラスを使用している場合、Enumerableである他のコレクションをラッピングするだけではなく、すべきだ。

しかし、私は常に、列挙型を手動で定義する場合でもyieldキーワードを使用する方が好きです。現在/移動を定義している人々のほとんどの例は、単に利回りや使用方法について知らないだけです。 (私は以前、その正確な理由でCurrent/Moveを定義する列挙可能なクラスを実装しました)

もう1つのケースは、基になるコレクションが古く、IEnumerable<T>ではなくIEnumerableを実装していない可能性があります。あなたのコレクションが強く型付けされている場合は、列挙子を返すだけではなく、少なくとも.Cast<T>()呼び出しになります。

基本コレクションがある場合は、公開する必要のないプライベートネストされたクラス(カスタムキーと値のペアなど)のコレクションでもあります。これは、既存の列挙子を渡すのではなく、.Select呼び出しを返す必要がある場合です(実際には独自の反復子を実装する必要はありません)。

0

これらの例は、事前ジェネリックである可能性がありますか?ジェネリックを使用していなかった場合、IEnumerableを実装し、そのメソッドを実装する必要があることがわかります。

3

ファイルの行を繰り返し処理し、すべてをメモリにロードしたくないとします。すべてをメモリにロードするのではなく、要求に応じて次の行を読み取るIEnumerable<string>を返すことができます。 @Servyのように、このような状況にはyieldを使用することをお勧めします。

関連する問題