7

基本的に、MSが今後のみをサポートする列挙子を実装することにした理由を疑問に思っています: MoveNext().

MovePrevious.NET フレームワーク全体で広く使用されているこのインターフェイスに対しても適用する方が柔軟ではないでしょうか?

MS の実装がはるかに簡単になり、パフォーマンスがより効率的になることは想像できますLinq.Reverseが、これにより他のことが遅くなったり、他のすべてに大きなオーバーヘッドがかかったりするかどうかはわかりません。

この件について詳しい方はどなたか詳しい情報を教えていただけないでしょうか? つまり、 を持っているか持っていないかの長所とMovePrevious短所IEnumerable/IEnumerable<T>

4

5 に答える 5

21

IEnumerable[<T>]ランダム アクセス リストではなく、一連のデータを表します。すべてのシーケンスを逆にしたり、再生したりできるわけではありません。ネットワーク ストリーム、データベース アクセスなどに基づくシーケンス - またはこの美しさ:

IEnumerable<int> GetData() {
    Random rand = new Random();
    while(true) { yield return rand.Next(); }
}

あなたができる最善のことは、最初からやり直すことです-呼び出すReset()これは非推奨です)のではなく、代わりに新しい列挙子を取得することです。

それがなくても、元に戻すことができないRandom単純なシーケンスを考え出すのは簡単です(バッファーをバッファリングして元に戻すことなく)。必要なものについては、代わりに見ることを検討してください。インデクサーを介して任意の順序でデータにアクセスできます。IList[<T>]

于 2009-11-26T23:23:53.177 に答える
6

MovePrevious を使用しても意味がないデータの種類は多数あります。たとえば、ネットワーク接続からデータを受信して​​いる場合、MovePrevious を指定すると、そのメソッドを呼び出した場合に備えて、ストリーム全体をバッファリングする必要があります。これにより、大量のメモリが浪費されます。

そうは言っても、MoveNext と MovePrevious の両方をサポートする別の型を使用すると便利な場合があります(たとえば、二重にリンクされたリストでこれをサポートできます)。

于 2009-11-26T23:21:55.893 に答える
1

MovePrevious を実装すると、より重いインターフェイスになります。一部のソース (配列、Container クラス) では MovePrevious は簡単ですが、他の多くのソースでは高価なバッファリングが必要になるか、それらのソースが除外されます。ネットワーク ストリームとデータベース接続は、シーク操作をサポートしていません。

于 2009-11-26T23:22:54.957 に答える
1

インターフェースを設計する際に関係する要素は、使用上の利便性だけではありません。どの程度の汎用性があり、どのような制約を追加するかを考慮する必要があります。

再生できないシーケンスがあり、それを実装するために多くの不要な要件を追加することになります。

それ以外にも、IList、IQueryable などのインターフェイスがあります。シナリオに最も適したものを使用して、必要な使用方法も伝えます。

于 2009-11-26T23:32:55.170 に答える
0

それは「利回り」に関するパターンと関係があります。事実上、列挙子は可能な限り最も単純なコレクションです。先頭から始めて最後まで使用するだけです。これは、列挙を実装するためのコードが非常に単純であることを意味します。

また、「終了」しないイテレータを使用して機能的なコードを作成することもできます。たとえば、

yield value++;

止まるまで数字が増えていきます。

于 2009-11-26T23:24:04.220 に答える