2009-03-06 15 views

risposta

90

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(); 

example code from codebetter.com

+3

@Rex M: Penso che il codice abbia senso. IEnumerable ha un metodo GetEnumerator che restituisce un IEnumer * ator *, non IEnumer * able *. – Lernkurve

+5

@Lernkurve la risposta è stata modificata per essere corretta dopo aver postato il mio commento. –

6

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(); 
     } 
    } 
58

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.

13

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.

+1

Il post di questo blog è piuttosto impreciso. – SLaks

Problemi correlati