Prima di saltare alla differenza tra IEnumerable e IEnumerator, dobbiamo prima capire i termini Enumerator e Enumerable e quando e perché utilizzarli.
Enumerable è un modulo utilizzato nella classe Array che fornisce Enumerator. La classe stessa non ha alcun metodo. Infatti, utilizza un metodo chiamato "GetEnumerator" che ti dà un Enumeratore per recuperare il suo oggetto.
Un Enumeratore è un oggetto che restituisce ciascun elemento in una raccolta in un ordine specifico, esattamente come richiesto. Il compilatore genera codice che utilizza un enumeratore quando si scrive un ciclo foreach in C #.
IEnumerator è un'interfaccia implementata da un enumeratore e la classe enumerabile implementa l'interfaccia IEnumerable.
IEnumerable è un'interfaccia di base utilizzata per ottenere un oggetto che sa come enumerare (o iterare) sugli elementi nella raccolta.
È un'implementazione del pattern iteratore che fornisce un meccanismo per attraversare un oggetto nella collezione indipendentemente dalla sua struttura interna. L'interfaccia IEnumerable rappresenta un oggetto che può essere iterato in una raccolta.
Utilizza solo un metodo "GetEnumerator" che restituisce un'istanza della classe di enumeratore che implementa l'interfaccia IEnumerator.
L'interfaccia IEnumerator, d'altra parte, dichiara due metodi - Reset () e MoveNext () - e una proprietà, Current. MoveNext () restituisce un valore booleano che indica la fine dell'elenco e aiuta a posizionare il primo elemento nell'elenco dopo aver chiamato il metodo Reset () - imposta l'enumeratore sulla sua posizione predefinita in modo da reiterare l'elenco dal inizio.
La proprietà Current può essere richiamata solo tramite un'istanza dell'interfaccia IEnumerator e restituisce l'elemento corrente nell'elenco.
Sia IEnumerable che IEnumerator sono interfacce che implementano insieme il modello di progettazione software iteratore in .Net Framework. Il .Net Framework consente l'accesso ai singoli elementi della collezione personalizzata mentre si implementano le interfacce IEnumerable e IEnumerator. L'interfaccia IEnumerable dichiara un solo metodo chiamato GetEnumerator che restituisce un altro tipo di interfaccia chiamata interfaccia IEnumerator per quella particolare raccolta. IEnumerator, d'altra parte, è l'interfaccia di base per tutti gli enumeratori non generici che vengono utilizzati per leggere i dati nella raccolta. Tuttavia, gli enumeratori non possono essere utilizzati per modificare la raccolta sottostante.
L'interfaccia IEnumerable definisce solo un metodo GetEnumerator () che è un metodo di istanza utilizzato su diversi tipi di raccolta. Ottiene un iteratore IEnumerator che può essere utilizzato per iterare su tutti i valori della collezione. Quando scrivi un ciclo foreach in C # il codice che genera chiama il metodo GetEnumerator per creare l'Enumeratore utilizzato dal ciclo.
IEnumerator, d'altra parte, utilizza due metodi MoveNext () e Reset () e una proprietà Current. Il metodo MoveNext () accetta l'enumeratore sull'elemento successivo della raccolta, mentre il metodo Reset () imposta l'enumeratore sulla sua posizione predefinita che è prima del primo elemento nella raccolta.
IEnumerable è un'interfaccia generica che fornisce un'astrazione per il looping sugli elementi e implementando l'interfaccia IEnumerable, una classe generica consente essenzialmente l'iterazione tramite l'interfaccia IEnumerator. In tal modo, queste classi finiscono per fornire un'interfaccia comune per recuperare un'istanza di un oggetto IEnumerator che supporti tutto il set di base dei metodi di navigazione.
IEnumerator è l'interfaccia di base per gli enumeratori e l'uso dell'interfaccia IEnumerable richiede che la classe debba implementare l'IEnumerator. Entrambe le interfacce devono essere implementate, se si desidera fornire supporto per foreach. La classe astratta 'AbstractEnumerator' implementa l'interfaccia IEnumerator.
L'interfaccia IEnumerable, insieme al supporto dell'interfaccia IEnumerator, ti permette di scorrere gli elementi nello stack usando l'istruzione 'foreach'. È l'interfaccia di base utilizzata per gli oggetti del tipo di raccolta. L'iterazione inizia con l'elemento superiore nello stack e termina con l'elemento più vecchio nella pila. In poche parole, rappresenta un oggetto che può essere enumerato.
Insieme all'interfaccia IEnumerator, abilitano gli elementi ArrayList a essere iterati in modo sequenziale e standardizzato, iniziando dal primo elemento e andando avanti. L'istruzione foreach utilizza i metodi e le proprietà dell'interfaccia IEnumerator per iterare tutti gli elementi di una raccolta.
In breve, sia IEnumerable che IEnumerator sono interfacce utilizzate per enumerare o iterare una classe che ha una natura di raccolta che significa che facilitano l'accesso iterativo in una raccolta personalizzata. IEnumerable è l'interfaccia generica disponibile per gli oggetti del tipo di raccolta e implementando l'interfaccia IEnumerable, una classe generica consente essenzialmente l'iterazione tramite l'interfaccia IEnumerator. Utilizza un solo metodo GetEnumerator che restituisce un'istanza della classe dell'enumeratore che implementa l'interfaccia IEnumerator. L'interfaccia IEnumerator è pensata per essere utilizzata come accessoria e non può essere utilizzata per modificare la raccolta sottostante. Fornisce due metodi astratti Reset () e MoveNext () e una proprietà Current per chiamare un elemento particolare in una raccolta.