Qual è la differenza tra IEnumerator e IEnumerable? [duplicare]
-
03-07-2019 - |
Domanda
Possibile duplicato:
Qualcuno può spiegarmi IEnumerable e IEnumerator?
Quali sono le differenze tra IEnumerator e IEnumerable?
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();
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();
}
}