Eventuali duplicati:
Can anyone explain IEnumerable and IEnumerator to me?Qual è la differenza tra IEnumerator e IEnumerable?
Quali sono le differenze tra IEnumerator e IEnumerable?
Eventuali duplicati:
Can anyone explain IEnumerable and IEnumerator to me?Qual è la differenza tra IEnumerator e IEnumerable?
Quali sono le differenze tra IEnumerator e IEnumerable?
IEnumerable è un'interfaccia che definisce un metodo GetEnumerator che restituisce un'interfaccia IEnumerator, questo a sua volta consente l'accesso in sola lettura a un insieme. 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();
@Rex M: Penso che il codice abbia senso. IEnumerable ha un metodo GetEnumerator che restituisce un IEnumer * ator *, non IEnumer * able *. – Lernkurve
@Lernkurve la risposta è stata modificata per essere corretta dopo aver postato il mio commento. –
IEnumerable e IEnumerator sono entrambe le interfacce. IEnumerable ha solo un metodo chiamato GetEnumerator. Questo metodo retun (come tutti i metodi restituiscono qualcosa che include il vuoto) un altro tipo che è un'interfaccia e quell'interfaccia è IEnumerator. Quando si implementa la logica dell'enumerazione in una qualsiasi classe 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 casella che contiene IEnumerator al suo interno (sebbene non attraverso l'ereditarietà o il contenimento). Vedere 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();
}
}
Un IEnumerator
è una cosa che può enumerare: ha la proprietà Current
ei MoveNext
e Reset
metodi (che nel codice .NET probabilmente non chiamare in modo esplicito , anche se tu potessi).
Un IEnumerable
è una cosa che può essere enumerata ... il che significa semplicemente che ha un metodo GetEnumerator che restituisce un IEnumerator
.
Quale usi? L'unico motivo per utilizzare IEnumerator
è se si dispone di qualcosa che ha un modo non standard di enumerazione (ovvero di restituire i suoi vari elementi uno alla volta), e occorre definire come funziona. Dovresti creare una nuova classe implementando IEnumerator
. Tuttavia, devi comunque restituire lo IEnumerator
in una classe IEnumerable
.
Per uno sguardo a ciò che un enumeratore (attuazione IEnumerator<T>
) assomiglia, vedere ogni classe Enumerator<T>
, come quelli contenuti nel List<T>
, Queue<T>,
o Stack<T>
. Per dare un'occhiata a una classe che implementa IEnumerable
, vedere qualsiasi classe di raccolta standard.
Un Enumerator
mostra gli elementi in un elenco o una raccolta. Ogni istanza di un Enumeratore si trova in una determinata posizione (il 1 ° elemento, il 7 ° elemento, ecc.) E può darti quell'elemento (IEnumerator.Current
) o passare a quello successivo (IEnumerator.MoveNext
). Quando si scrive un ciclo foreach
in C#, il compilatore genera codice che utilizza un enumeratore.
Un Enumerable
è una classe che può darti Enumerator
s.Ha un metodo chiamato GetEnumerator
che ti dà un Enumerator
che guarda i suoi articoli. Quando scrivi un ciclo foreach
in C#, il codice che genera chiama GetEnumerator
per creare lo Enumerator
utilizzato dal ciclo.
Il post di questo blog è piuttosto impreciso. – SLaks
Duplicato: http://stackoverflow.com/questions/558304/can-anyone-explain-ienumerable-and-ienumerator-to-me –