6

IEnumerator<T>yield ブロックを使用して、後方 ( ) と前方に移動できるを実装する方法はありMoveLast()ますか?

4

7 に答える 7

5

イテレータブロックから直接ではありません。

ただし、呼び出し元はいつでも結果をバッファリングできます。たとえば、、List<T>または単に呼び出すだけですReverse()が、これが常に当てはまるとは限りません。

于 2009-01-16T16:53:45.273 に答える
5

いいえ、C# コンパイラによって生成されたステート マシンは厳密に順方向です。

多くの場合、逆戻りしても意味がありません。ネットワーク ストリームから読み取るイテレータを想像してみてください。逆方向に移動するには、これまで読み取ったすべてのデータを記憶する必要があります。これは、時間を巻き戻してネットワークにデータを再度要求することができないためです。

(何らかの損失のある方法でデータを生成したものは何でも同じです。反復ごとに Conway's Life の新しいボードを返すイテレータを想像してください。すべて前のボードである可能性がある複数のボードがあるため、に戻るには、何をしたかをもう一度覚えておく必要があります。すでに戻ってきました。)

于 2009-01-16T16:50:20.227 に答える
1

C5コレクションライブラリ(http://www.itu.dk/research/c5/)は、コレクションと後方列挙を使用したリンクリストを実装します。プロジェクトはオープンソースなので、そこで答えを見つけることができるはずです。

于 2009-01-16T16:54:02.933 に答える
1

いいえ。IEnumeratorの制限の1つは、現在の状態を保持し、以前の状態を記憶しないことです。その結果、IEnumerableは転送専用になります。

以前の状態を保持する必要がある場合は、IEnumerableをListまたはLinkedListに読み込み、代わりにそれらのオブジェクトを列挙します。

于 2009-01-16T16:56:31.557 に答える
1

実際、Accelerated C#2008で説明されているアプローチがあるようです。残念ながら、2つのページはプレビューに表示されず、リフレクション(通常どおり、結果をキャッシュできます)に依存する必要がありますが、要点を理解することができます。

于 2009-01-16T17:29:07.777 に答える
0

いいえ。 を使用yieldすると、IEnumerable一方向の が生成されます。

于 2009-01-16T16:50:25.000 に答える