Qual é a diferença entre IEnumerator e IEnumerable? [duplicado]
-
03-07-2019 - |
Pergunta
Duplicate possíveis:
alguém pode explicar IEnumerable e IEnumerator para mim?
Quais são as diferenças entre IEnumerator e IEnumerable?
Solução
IEnumerable é uma interface que define um método GetEnumerator que retorna um IEnumerator interface, este por sua vez permite o acesso somente leitura a uma coleção. Uma coleção que implementa IEnumerable pode ser usado com uma declaração foreach.
Definição
IEnumerable
public IEnumerator GetEnumerator();
IEnumerator
public object Current;
public void Reset();
public bool MoveNext();
Outras dicas
Um IEnumerator
é uma coisa que pode enumerar:. Tem a propriedade Current
e os métodos MoveNext
e Reset
(que em código .NET você provavelmente não vai chamar explicitamente, embora você poderia)
Um IEnumerable
é uma coisa que pode ser enumerados ... que simplesmente significa que ele tem um método GetEnumerator que retorna um IEnumerator
.
O que você usa? A única razão para o uso IEnumerator
é se você tem algo que tem uma maneira fora do padrão de enumerar (isto é, de retornar seus vários elementos um por um), e você precisa definir como isso funciona. Você iria criar uma nova classe de implementação IEnumerator
. Mas você ainda precisa voltar que IEnumerator
em uma classe IEnumerable
.
Para uma olhada no que um enumerador (IEnumerator<T>
implementação) parece, ver qualquer classe Enumerator<T>
, tais como as contidas no List<T>
, Queue<T>,
ou Stack<T>
. Para uma olhada em um IEnumerable
classe de implementação, consulte qualquer classe de coleção padrão.
Um Enumerator
mostra os itens em uma lista ou coleção.
Cada exemplo de um Enumerador está numa determinada posição (o primeiro elemento, o elemento 7, etc) e pode dar-lhe que elemento (IEnumerator.Current
) ou movimento para a próxima (IEnumerator.MoveNext
). Quando você escrever um loop foreach
em C #, o compilador gera código que usa um enumerador.
Um Enumerable
é uma classe que pode dar-lhe Enumerator
s. Ele tem um método chamado GetEnumerator
que lhe dá uma Enumerator
que olha para os seus itens. Quando você escrever um loop foreach
em C #, o código que gera chamadas GetEnumerator
para criar o Enumerator
usado pelo loop.
IEnumerable e IEnumerator são as duas interfaces. IEnumerable tem apenas um método chamado GetEnumerator. Este método retuns (como todos os métodos retornar algo incluindo void) outro tipo que é uma interface e que a interface é IEnumerator. Quando você implementar a lógica recenseador em qualquer de sua classe de coleção, você implementa IEnumerable (genérico ou não genérico). IEnumerable tem apenas um método Considerando IEnumerator tem 2 (métodos MoveNext e Reset) e uma propriedade actual. Para facilitar a compreensão considerar IEnumebale uma caixa que contém IEnumerator dentro dela (embora não por herança ou contenção). Veja o código para melhor entendimento:
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();
}
}