可能性のある複製:
誰でもIEnumerableとIEnumeratorを説明できますか?
IEnumeratorとIEnumerableの違いは何ですか?
IEnumerable は、1つのメソッドを定義するインターフェイスですGetEnumeratorは、IEnumeratorインターフェイスを返します。コレクション。 IEnumerableを実装するコレクションは、foreachステートメントで使用できます。
定義
IEnumerable
public IEnumerator GetEnumerator();
IEnumerator
public object Current;
public void Reset();
public bool MoveNext();
IEnumerator
は列挙可能なものです。Current
プロパティとMoveNext
およびReset
メソッド(.NETコードではおそらく明示的に呼び出されませんが、可能ですが)。
IEnumerable
は列挙可能なものです...これは単に、IEnumerator
を返すGetEnumeratorメソッドがあることを意味します。
どちらを使用しますか? IEnumerator
を使用する唯一の理由は、非標準的な列挙方法(つまり、さまざまな要素を1つずつ返す)があり、その動作を定義する必要がある場合です。 IEnumerator
を実装する新しいクラスを作成します。ただし、IEnumerator
クラスのIEnumerable
を返す必要があります。
列挙子(IEnumerator<T>
を実装)の外観については、Enumerator<T>
、List<T>
、またはQueue<T>,
に含まれるクラスなど、Stack<T>
クラスを参照してください。 。 IEnumerable
を実装するクラスについては、標準のコレクションクラスをご覧ください。
Enumerator
は、リストまたはコレクション内のアイテムを示します。列挙子の各インスタンスは特定の位置(1番目の要素、7番目の要素など)にあり、その要素を提供する(IEnumerator.Current
)か、次の要素に移動する(IEnumerator.MoveNext
)ことができます。 C#でforeach
ループを記述すると、コンパイラは列挙子を使用するコードを生成します。
Enumerable
は、Enumerator
sを提供できるクラスです。 GetEnumerator
というメソッドがあり、アイテムを見るEnumerator
を提供します。 C#でforeach
ループを記述すると、生成するコードはGetEnumerator
を呼び出して、ループで使用されるEnumerator
を作成します。
IEnumerable
とIEnumerator
は両方ともインターフェースです。 IEnumerable
には、GetEnumerator
というメソッドが1つだけあります。このメソッドは、すべてのメソッドがvoidを含む何かを返すため、インターフェイスである別のタイプを返し、そのインターフェイスはIEnumerator
です。コレクションクラスのいずれかに列挙子ロジックを実装する場合、IEnumerable
(ジェネリックまたは非ジェネリック)を実装します。 IEnumerable
には1つのメソッドしかありませんが、IEnumerator
には2つのメソッド(MoveNext
およびReset
)とプロパティCurrent
があります。理解を容易にするために、IEnumerable
をその中にIEnumerator
を含むボックスと考えてください(ただし、継承または包含によるものではありません)。理解を深めるためにコードを参照してください。
class Test : IEnumerable, IEnumerator
{
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
public object Current
{
get { throw new NotImplementedException(); }
}
public bool MoveNext()
{
throw new NotImplementedException();
}
public void Reset()
{
throw new NotImplementedException();
}
}