一連のメソッド()全体で一連のアイテム()を処理する必要があるC#クラスがあるIEnumerable<T>
ため、メソッド内で単純に処理することはできませんforeach
。私はこれを呼び出し.GetEnumerator()
て渡します。これIEnumerator<T>
は非常にうまく機能し、単一のシーケンスをループするときに必要な柔軟性を提供します。
ここで、他の人がこのプロセスにロジックを追加できるようにします。これを行う最も自然な方法は、を受け入れるメソッドとのインターフェースを提供することIEnumerator<T>
です。簡単、完了、そしてそれは機能します。
しかし、これがアンチパターンであることが心配です。彼らは、IEnumerator<T>
がすでに.MoveNext()
電話をかけていることを知っている必要があるので、簡単にアクセスできます.Current
。IEnumerator<T>
加えて、実装されるインターフェースで使用する前例は見当たりません。
- 私が考慮していない落とし穴は何ですか?
- それ自体を公開せずに、これと同じ効率的なメカニズム(つまり、複数のコピーを作成/破棄したくない)を可能にする別のパターンはあり
IEnumerator<T>
ますか?
更新:以下のコメントで述べたように:私が欲しいのはある種の一般的なものStream<T>
です。次のアイテムを効果的に見て(IEnumerator.Current
-> .Peek()
)、それを消費できるようにする必要があります(IEnumerator<T>.MoveNext()
-> .Pop()
)。
IEnumerator<T>
ビルのインターフェースにぴったり合うので使用しました。私は一般的なBCLタイプを適切なときに使用することを好みますが、これを悪用しているように見えました。
それで質問3)このニーズに合うクラスはありますか?IEnumerator<T>
または、内部で遅延実行する独自のストリームを作成する必要がありますか?その後、完全にカプセル化されます。既存のコレクションの多くは内部ストレージを備えているため使用したくないのですが、ストレージはIEnumerable<T>
iteslfにしたいのです。
OK、コンセンサスは、IEnumerator<T>
多くの場合ValueType
、の状態を事前に知らないだけでなく、IEnumerator<T>
それを渡すことは一般的に悪い考えであるということのように聞こえます。
私が聞いた中で最も良い提案は、渡される独自のクラスを作成することです。他に何か提案はありますか?