Compartilhar via


IEnumerator<T> Interface

Definição

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

generic <typename T>
public interface class IEnumerator : IDisposable, System::Collections::IEnumerator
public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator
public interface IEnumerator<T> : IDisposable, System.Collections.IEnumerator
type IEnumerator<'T> = interface
    interface IEnumerator
    interface IDisposable
type IEnumerator<'T> = interface
    interface IDisposable
    interface IEnumerator
Public Interface IEnumerator(Of Out T)
Implements IDisposable, IEnumerator
Public Interface IEnumerator(Of T)
Implements IDisposable, 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>.


// 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; }
    }
}
' Defines the enumerator for the Boxes collection.
' (Some prefer this class nested in the collection class.)
Public Class BoxEnumerator
    Implements IEnumerator(Of Box)
    Private _collection As BoxCollection
    Private curIndex As Integer
    Private curBox As Box


    Public Sub New(ByVal collection As BoxCollection)
        MyBase.New()
        _collection = collection
        curIndex = -1
        curBox = Nothing

    End Sub

    Private Property Box As Box
    Public Function MoveNext() As Boolean _
        Implements IEnumerator(Of Box).MoveNext
        curIndex = curIndex + 1
        If curIndex = _collection.Count Then
            ' Avoids going beyond the end of the collection.
            Return False
        Else
            'Set current box to next item in collection.
            curBox = _collection(curIndex)
        End If
        Return True
    End Function

    Public Sub Reset() _
        Implements IEnumerator(Of Box).Reset
        curIndex = -1
    End Sub

    Public Sub Dispose() _
        Implements IEnumerator(Of Box).Dispose

    End Sub

    Public ReadOnly Property Current() As Box _
        Implements IEnumerator(Of Box).Current

        Get
            If curBox Is Nothing Then
                Throw New InvalidOperationException()
            End If

            Return curBox
        End Get
    End Property

    Private ReadOnly Property Current1() As Object _
        Implements IEnumerator.Current

        Get
            Return Me.Current
        End Get
    End Property
End Class

' Defines two boxes as equal if they have the same dimensions.
Public Class BoxSameDimensions
    Inherits EqualityComparer(Of Box)

    Public Overrides Function Equals(ByVal b1 As Box, ByVal b2 As Box) As Boolean
        If b1.Height = b2.Height And b1.Length = b2.Length And b1.Width = b2.Width Then
            Return True
        Else
            Return False
        End If
    End Function

    Public Overrides Function GetHashCode(ByVal bx As Box) As Integer
        Dim hCode As Integer = bx.Height ^ bx.Length ^ bx.Width
        Return hCode.GetHashCode()
    End Function
End Class

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

Confira também