Antes de abordarmos a diferença entre IEnumerable e IEnumerator, primeiro entendemos os termos Enumerador e Enumerável e quando e por que usá-los..
Enumerável é um módulo usado na classe Array que fornece o Enumerador. A própria classe não faz cada método. De fato, ele usa um método chamado 'GetEnumerator' que fornece um enumerador para recuperar seu item.
Um enumerador é um objeto que retorna cada item de uma coleção em uma ordem específica, exatamente como eles são solicitados. O compilador gera código que usa um enumerador, quando você escreve um loop foreach em c #.
IEnumerator é uma interface implementada por um enumerador e a classe enumerável implementa a interface IEnumerable.
IEnumerable é uma interface básica usada para obter um objeto que sabe enumerar (ou iterar) sobre os elementos da coleção.
É uma implementação do padrão de iterador que fornece um mecanismo para atravessar um objeto na coleção, independentemente de sua estrutura interna. A interface IEnumerable representa um objeto que pode ser iterado em uma coleção.
Ele usa apenas um método "GetEnumerator" que retorna uma instância de classe do enumerador que implementa a interface IEnumerator.
A interface IEnumerator, por outro lado, declara dois métodos - Reset () e MoveNext () - e uma propriedade, Current. O MoveNext () retorna um vale booleano que indica o final da lista e ajuda a posicionar o primeiro elemento da lista após chamar o método Reset () - ele define o enumerador para sua posição padrão, para reiterar a lista a partir do começando.
A propriedade Current pode ser chamada apenas por meio de uma instância da interface IEnumerator e retorna o elemento atual na lista.
IEnumerable e IEnumerator são interfaces que implementam o padrão de design de software do iterador no .Net Framework juntos. O .Net Framework facilita o acesso a elementos individuais na coleção personalizada ao implementar as interfaces IEnumerable e IEnumerator. A interface IEnumerable declara apenas um método chamado GetEnumerator que retorna outro tipo de interface chamado interface IEnumerator para essa coleção específica. IEnumerator, por outro lado, é a interface base para todos os enumeradores não genéricos que são usados para ler os dados na coleção. No entanto, enumeradores não podem ser usados para modificar a coleção subjacente.
A interface IEnumerable define apenas um método GetEnumerator (), que é um método de instância usado em vários tipos de coleção diferentes. Ele obtém um iterador IEnumerator que pode ser usado para iterar sobre todos os valores da coleção. Quando você escreve um loop foreach em C #, o código gerado chama o método GetEnumerator para criar o enumerador usado pelo loop.
IEnumerator, por outro lado, usa dois métodos MoveNext () e Reset () e uma propriedade Current. O método MoveNext () leva o enumerador para o próximo elemento da coleção, enquanto o método Reset () define o enumerador para sua posição padrão, que é anterior ao primeiro elemento da coleção.
IEnumerable é uma interface genérica que fornece uma abstração para repetir elementos e, ao implementar a interface IEnumerable, uma classe genérica basicamente permite a iteração por meio da interface IEnumerator. Ao fazer isso, essas classes acabam fornecendo uma interface comum para recuperar uma instância de um objeto IEnumerator que suporta todo o conjunto básico de métodos de navegação.
IEnumerator é a interface base para enumeradores e o uso da interface IEnumerable requer que a classe implemente o IEnumerator. Ambas as interfaces precisam ser implementadas, se você deseja fornecer suporte para o foreach. A classe abstrata 'AbstractEnumerator' implementa a interface IEnumerator.
A interface IEnumerable, juntamente com a interface IEnumerator de suporte, permite iterar sobre os elementos da pilha usando a instrução 'foreach'. É a interface básica usada para objetos do tipo coleção. A iteração começa com o elemento superior na pilha e termina com o elemento mais antigo na pilha. Simplificando, representa um objeto que pode ser enumerado.
Juntamente com a interface IEnumerator, eles permitem que os elementos ArrayList sejam iterados de maneira sequencial e padronizada, começando com o primeiro elemento e seguindo adiante. A instrução foreach usa os métodos e propriedades da interface IEnumerator para iterar todos os elementos em uma coleção.
Em poucas palavras, IEnumerable e IEnumerator são interfaces usadas para enumerar ou iterar uma classe que possui uma natureza de coleção, o que significa que eles facilitam o acesso iterativo em uma coleção personalizada. IEnumerable é a interface genérica disponível para objetos do tipo coleção e, ao implementar a interface IEnumerable, uma classe genérica basicamente permite a iteração por meio da interface IEnumerator. Ele usa apenas um método GetEnumerator que retorna uma instância de classe do enumerador que implementa a interface IEnumerator. A interface IEnumerator deve ser usada como acessador e não pode ser usada para modificar a coleção subjacente. Ele fornece dois métodos abstratos Reset () e MoveNext () e uma propriedade Current para chamar um elemento específico em uma coleção.