Ler em inglês

Partilhar via


IEnumerator<T> Interface

Definição

Dá suporte a uma iteração simples em uma coleção genérica.

C#
public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator
C#
public interface IEnumerator<T> : IDisposable, System.Collections.IEnumerator

Parâmetros de tipo

T

O tipo de objetos a serem enumerados.

Este parâmetro de tipo é covariante. Isso significa que é possível usar o tipo especificado ou qualquer tipo mais derivado. Para obter mais informações sobre covariância e contravariância, consulte Covariância e contravariância em genéricos.
Derivado
Implementações

Exemplos

O exemplo a seguir mostra uma implementação da interface IEnumerator<T> para uma classe de coleção de objetos personalizados. O objeto personalizado é uma instância do tipo Boxe a classe de coleção é BoxCollection. Este exemplo de código faz parte de um exemplo maior fornecido para a interface ICollection<T>.

C#

// Defines the enumerator for the Boxes collection.
// (Some prefer this class nested in the collection class.)
public class BoxEnumerator : IEnumerator<Box>
{
    private BoxCollection _collection;
    private int curIndex;
    private Box curBox;

    public BoxEnumerator(BoxCollection collection)
    {
        _collection = collection;
        curIndex = -1;
        curBox = default(Box);
    }

    public bool MoveNext()
    {
        //Avoids going beyond the end of the collection.
        if (++curIndex >= _collection.Count)
        {
            return false;
        }
        else
        {
            // Set current box to next item in collection.
            curBox = _collection[curIndex];
        }
        return true;
    }

    public void Reset() { curIndex = -1; }

    void IDisposable.Dispose() { }

    public Box Current
    {
        get { return curBox; }
    }

    object IEnumerator.Current
    {
        get { return Current; }
    }
}

Comentários

IEnumerator<T> é a interface base para todos os enumeradores genéricos.

A instrução foreach da linguagem C# (for each em C++, For Each no Visual Basic) oculta a complexidade dos enumeradores. Portanto, é recomendável usar foreach, em vez de manipular diretamente o enumerador.

Os enumeradores podem ser usados para ler os dados na coleção, mas não podem ser usados para modificar a coleção subjacente.

Inicialmente, o enumerador é posicionado antes do primeiro elemento da coleção. Nesta posição, Current é indefinido. Portanto, você deve chamar MoveNext para avançar o enumerador para o primeiro elemento da coleção antes de ler o valor de Current.

Current retorna o mesmo objeto até que MoveNext seja chamado. MoveNext define Current para o próximo elemento.

Se MoveNext passar o final da coleção, o enumerador será posicionado após o último elemento na coleção e MoveNext retornará false. Quando o enumerador estiver nessa posição, as chamadas subsequentes para MoveNext também retornarão false. Se a última chamada para MoveNext retornada false, Current será indefinida. Não é possível definir Current para o primeiro elemento da coleção novamente; em vez disso, você deve criar uma nova instância de enumerador.

O método Reset é fornecido para interoperabilidade COM. Ele não precisa necessariamente ser implementado; em vez disso, o implementador pode simplesmente lançar um NotSupportedException. No entanto, se você optar por fazer isso, verifique se nenhum chamador está confiando na funcionalidade Reset.

Se forem feitas alterações na coleção, como adicionar, modificar ou excluir elementos, o comportamento do enumerador será indefinido.

O enumerador não tem acesso exclusivo à coleção; portanto, enumerar por meio de uma coleção não é intrinsecamente um procedimento thread-safe. Para garantir a segurança do thread durante a enumeração, você pode bloquear a coleção durante toda a enumeração. Para permitir que a coleção seja acessada por vários threads para leitura e gravação, você deve implementar sua própria sincronização.

As implementações padrão de coleções no namespace System.Collections.Generic não são sincronizadas.

Notas aos Implementadores

Implementar essa interface requer a implementação da interface de IEnumerator não genérica. Os métodos MoveNext() e Reset() não dependem de Te aparecem apenas na interface não genérica. A propriedade Current aparece em ambas as interfaces e tem tipos de retorno diferentes. Implemente a propriedade Current não genérica como uma implementação de interface explícita. Isso permite que qualquer consumidor da interface não genérica consuma a interface genérica.

Além disso, IEnumerator<T> implementa IDisposable, o que exige que você implemente o método Dispose(). Isso permite que você feche conexões de banco de dados ou identificadores de arquivo de versão ou operações semelhantes ao usar outros recursos. Se não houver recursos adicionais para descartar, forneça uma implementação de Dispose() vazia.

Propriedades

Current

Obtém o elemento na coleção na posição atual do enumerador.

Métodos

Dispose()

Executa tarefas definidas pelo aplicativo associadas à liberação, liberação ou redefinição de recursos não gerenciados.

(Herdado de IDisposable)
MoveNext()

Avança o enumerador para o próximo elemento da coleção.

(Herdado de IEnumerator)
Reset()

Define o enumerador como sua posição inicial, que é antes do primeiro elemento na coleção.

(Herdado de IEnumerator)

Aplica-se a

Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Confira também