IEnumerable
IEnumerable インタフェースは System.Collections 名前空間にあります。これは、非汎用コレクションに対する単純な走査をサポートするエニュメレータを表示します。GetEnumerator()メソッドはこのインタフェースを実装するエニュメレータを取得します。返される IEnumerator オブジェクトがコレクション内で走査されます。GetEnumerator()メソッドは、C# の foreach ループによって暗黙的に使用されます。
IEnumerator
IEnumerator インタフェースは System.Collections 名前空間にあります。これは非汎用コレクションに対する単純な走査をサポートします。IEnumerator はすべての非汎用エニュメレータのベース インタフェースです。C# の foreach 文はエニュメレータの複雑さを非表示にします。
注: エニュメレータを直接操作するのではなく、foreach を使用することをお勧めします。
エニュメレータはコレクション データの読み取りに使用されますが、基礎となるコレクションの修正に使用することはできません。次のように IEnumerator を使用します。
- 最初、エニュメレータはコレクション内の最初の要素の前に配置されます。ただし、初めてエニュメレータを取得する場合は、常に Reset() を呼び出すことをお勧めします。
- Reset()メソッドは、エニュメレータを元の位置に戻します。この位置で、現在のプロパティを呼び出すと例外が発生します。
- 現在のイテレタ値を読み取る前にエニュメレータをコレクションの最初の要素に前進させるには、MoveNext()メソッドを呼び出します。
- MoveNext()メソッドまたは Reset()メソッドのいずれかが呼び出されるまで、現在のプロパティは同じオブジェクトを返します。MoveNext()メソッドは、現在のイテレタを次の要素に設定します。
- MoveNext がコレクションの終端を通過すると、エニュメレータはコレクションの最後の要素の後ろに配置され、MoveNext は False を返します。
- エニュメレータがこの位置にある場合、その後 MoveNext への呼び出しを行っても False が返されます。
- MoveNext への最後の呼び出しが False を返した場合、現在のプロパティの呼び出しをすると例外が発生します。
- 現在のイテレタをコレクションの最初の要素に再度設定するには、Reset()メソッドを呼び出してから MoveNext()を呼び出します。
- コレクションが変更されない間は、エニュメレータは有効のままとなります。
- コレクションに要素の追加、修正、削除といった変更を行うと、エニュメレータが無効になり、その後 MoveNext()や Reset()メソッドを呼び出すと InvalidOperationException が発生します。
- MoveNext と現在のイテレタの間でコレクションが修正されると、エニュメレータが既に無効になっている場合でも、現在のプロパティが特定の要素に返されます。
注: Reset()メソッドへの呼び出しの結果はすべてエニュメレータの状態と同じになります。コレクションの先頭の最初の要素の前にエニュメレータを移動するという実装をお勧めします。これにより、エニュメレータの作成後にコレクションが修正されるとエニュメレータが無効になります。これは、MoveNext()および現在のプロパティと一致します。