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