質問

  

可能な重複:
  誰でもIEnumerableとIEnumeratorを私に説明できますか?

IEnumeratorとIEnumerableの違いは何ですか?

役に立ちましたか?

解決

IEnumerable は、1つのメソッドを定義するインターフェイスです GetEnumerator IEnumeratorを返します インターフェース。これにより、コレクションへの読み取り専用アクセスが可能になります。 IEnumerableを実装するコレクションは、foreachステートメントで使用できます。

定義

IEnumerable 

public IEnumerator GetEnumerator();

IEnumerator

public object Current;
public void Reset();
public bool MoveNext();

codebetter.comのサンプルコード

他のヒント

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();
        }
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top