IEnumerator<T>
yield ブロックを使用して、後方 ( ) と前方に移動できるを実装する方法はありMoveLast()
ますか?
7 に答える
イテレータブロックから直接ではありません。
ただし、呼び出し元はいつでも結果をバッファリングできます。たとえば、、List<T>
または単に呼び出すだけですReverse()
が、これが常に当てはまるとは限りません。
いいえ、C# コンパイラによって生成されたステート マシンは厳密に順方向です。
多くの場合、逆戻りしても意味がありません。ネットワーク ストリームから読み取るイテレータを想像してみてください。逆方向に移動するには、これまで読み取ったすべてのデータを記憶する必要があります。これは、時間を巻き戻してネットワークにデータを再度要求することができないためです。
(何らかの損失のある方法でデータを生成したものは何でも同じです。反復ごとに Conway's Life の新しいボードを返すイテレータを想像してください。すべて前のボードである可能性がある複数のボードがあるため、前に戻るには、何をしたかをもう一度覚えておく必要があります。すでに戻ってきました。)
C5コレクションライブラリ(http://www.itu.dk/research/c5/)は、コレクションと後方列挙を使用したリンクリストを実装します。プロジェクトはオープンソースなので、そこで答えを見つけることができるはずです。
いいえ。IEnumeratorの制限の1つは、現在の状態を保持し、以前の状態を記憶しないことです。その結果、IEnumerableは転送専用になります。
以前の状態を保持する必要がある場合は、IEnumerableをListまたはLinkedListに読み込み、代わりにそれらのオブジェクトを列挙します。
実際、Accelerated C#2008で説明されているアプローチがあるようです。残念ながら、2つのページはプレビューに表示されず、リフレクション(通常どおり、結果をキャッシュできます)に依存する必要がありますが、要点を理解することができます。
いいえ。 を使用yield
すると、IEnumerable
一方向の が生成されます。