Ler em inglês

Compartilhar via


IEnumerator Interface

Definição

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

C#
public interface IEnumerator
C#
[System.Runtime.InteropServices.Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerator
C#
[System.Runtime.InteropServices.Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
[System.Runtime.InteropServices.ComVisible(true)]
public interface IEnumerator
Derivado
Atributos

Exemplos

O exemplo de código a seguir demonstra a implementação das interfaces IEnumerable e IEnumerator para uma coleção personalizada. Neste exemplo, os membros dessas interfaces não são explicitamente chamados, mas são implementados para dar suporte ao uso de foreach (for each no Visual Basic) para iterar por meio da coleção.

C#
using System;
using System.Collections;

// Simple business object.
public class Person
{
    public Person(string fName, string lName)
    {
        this.firstName = fName;
        this.lastName = lName;
    }

    public string firstName;
    public string lastName;
}

// Collection of Person objects. This class
// implements IEnumerable so that it can be used
// with ForEach syntax.
public class People : IEnumerable
{
    private Person[] _people;
    public People(Person[] pArray)
    {
        _people = new Person[pArray.Length];

        for (int i = 0; i < pArray.Length; i++)
        {
            _people[i] = pArray[i];
        }
    }

// Implementation for the GetEnumerator method.
    IEnumerator IEnumerable.GetEnumerator()
    {
       return (IEnumerator) GetEnumerator();
    }

    public PeopleEnum GetEnumerator()
    {
        return new PeopleEnum(_people);
    }
}

// When you implement IEnumerable, you must also implement IEnumerator.
public class PeopleEnum : IEnumerator
{
    public Person[] _people;

    // Enumerators are positioned before the first element
    // until the first MoveNext() call.
    int position = -1;

    public PeopleEnum(Person[] list)
    {
        _people = list;
    }

    public bool MoveNext()
    {
        position++;
        return (position < _people.Length);
    }

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

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

    public Person Current
    {
        get
        {
            try
            {
                return _people[position];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
}

class App
{
    static void Main()
    {
        Person[] peopleArray = new Person[3]
        {
            new Person("John", "Smith"),
            new Person("Jim", "Johnson"),
            new Person("Sue", "Rabon"),
        };

        People peopleList = new People(peopleArray);
        foreach (Person p in peopleList)
            Console.WriteLine(p.firstName + " " + p.lastName);
    }
}

/* This code produces output similar to the following:
 *
 * John Smith
 * Jim Johnson
 * Sue Rabon
 *
 */

Comentários

IEnumerator é a interface base para todos os enumeradores não genéricos. Seu equivalente genérico é a interface System.Collections.Generic.IEnumerator<T>.

A instrução foreach da linguagem 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.

O método Reset é fornecido para interoperabilidade COM e não precisa ser totalmente implementado; em vez disso, o implementador pode lançar um NotSupportedException.

Inicialmente, o enumerador é posicionado antes do primeiro elemento da coleção. Você deve chamar o método MoveNext para avançar o enumerador para o primeiro elemento da coleção antes de ler o valor de Current; caso contrário, Current é indefinido.

Current retorna o mesmo objeto até que MoveNext ou Reset 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.

Para definir Current para o primeiro elemento da coleção novamente, você pode chamar Reset, se ela for implementada, seguida por MoveNext. Se Reset não for implementado, você deverá criar uma nova instância de enumerador para retornar ao primeiro elemento da coleção.

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. Mesmo quando uma coleção é sincronizada, outros threads ainda podem modificar a coleção, o que faz com que o enumerador gere uma exceção. Para garantir a segurança do thread durante a enumeração, você pode bloquear a coleção durante toda a enumeração ou capturar as exceções resultantes de alterações feitas por outros threads.

Propriedades

Current

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

Métodos

MoveNext()

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

Reset()

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

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 1.1, 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