Pergunta

Duplicate possíveis:
alguém pode explicar IEnumerable e IEnumerator para mim?

Quais são as diferenças entre IEnumerator e IEnumerable?

Foi útil?

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

exemplo de código a partir codebetter.com

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 Enumerators. 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();
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top