Domanda

  

Possibile duplicato:
   Qualcuno può spiegarmi IEnumerable e IEnumerator?

Quali sono le differenze tra IEnumerator e IEnumerable?

È stato utile?

Soluzione

IEnumerable è un'interfaccia che definisce un metodo GetEnumerator che restituisce un IEnumerator , questa a sua volta consente l'accesso in sola lettura a una raccolta. Una raccolta che implementa IEnumerable può essere utilizzata con un'istruzione foreach.

Definizione

IEnumerable 

public IEnumerator GetEnumerator();

IEnumerator

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

codice di esempio da codebetter.com

Altri suggerimenti

Un IEnumerator è una cosa che può essere enumerata: ha la proprietà Current e i metodi MoveNext e Reset (che nel codice .NET probabilmente non chiamerai esplicitamente, anche se potresti).

Un IEnumerable è una cosa che può essere enumerata ... il che significa semplicemente che ha un metodo GetEnumerator che restituisce un IEnumerator<T>.

Quale usi? L'unico motivo per usare Enumerator<T> è se hai qualcosa che ha un modo non standard di enumerare (cioè di restituire i suoi vari elementi uno per uno), e devi definire come funziona. Creeresti una nuova classe implementando List<T>. Ma dovrai comunque restituirlo Queue<T>, in una Stack<T> classe.

Per dare un'occhiata a come appare un enumeratore (implementando <=>), guarda qualsiasi <=> classe, come quelle contenute in <=>, <=> o <=>. Per uno sguardo a una classe che implementa <=>, vedi qualsiasi classe di raccolta standard.

Un Enumerator mostra gli elementi in un elenco o in una raccolta. Ogni istanza di un enumeratore si trova in una determinata posizione (il 1o elemento, il 7o elemento, ecc.) E può fornirti quell'elemento (IEnumerator.Current) o passare a quello successivo (IEnumerator.MoveNext). Quando si scrive un foreach ciclo in C #, il compilatore genera codice che utilizza un enumeratore.

Un Enumerable è una classe che può darti GetEnumerator s. Ha un metodo chiamato <=> che ti dà un <=> che guarda i suoi oggetti. Quando scrivi un <=> ciclo in C #, il codice che genera chiama <=> per creare il <=> usato dal ciclo.

IEnumerable e IEnumerator sono entrambe interfacce. IEnumerable ha solo un metodo chiamato GetEnumerator. Questo metodo riavvia (poiché tutti i metodi restituiscono qualcosa incluso void) un altro tipo che è un'interfaccia e quell'interfaccia è IEnumerator. Quando si implementa la logica dell'enumeratore in una qualsiasi delle proprie classi di raccolta, si implementa IEnumerable (generico o non generico). IEnumerable ha solo un metodo mentre IEnumerator ha 2 metodi (MoveNext e Reset) e una proprietà Current. Per una facile comprensione considera IEnumebale una scatola che contiene IEnumerator al suo interno (anche se non attraverso l'ereditarietà o il contenimento). Vedi il codice per una migliore comprensione:

    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();
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top