Leer en inglés

Compartir a través de


IEnumerator Interfaz

Definición

Admite una iteración simple sobre una colección no 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

Ejemplos

En el ejemplo de código siguiente se muestra la implementación de las interfaces IEnumerable y IEnumerator para una colección personalizada. En este ejemplo, no se llama explícitamente a los miembros de estas interfaces, pero se implementan para admitir el uso de foreach (for each en Visual Basic) para recorrer en iteración la colección.

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
 *
 */

Comentarios

IEnumerator es la interfaz base para todos los enumeradores no genéricos. Su equivalente genérico es la interfaz System.Collections.Generic.IEnumerator<T>.

La instrucción foreach del lenguaje C# (for each en Visual Basic) oculta la complejidad de los enumeradores. Por lo tanto, se recomienda usar foreach en lugar de manipular directamente el enumerador.

Los enumeradores se pueden usar para leer los datos de la colección, pero no se pueden usar para modificar la colección subyacente.

El método Reset se proporciona para la interoperabilidad COM y no es necesario implementar completamente; en su lugar, el implementador puede iniciar un NotSupportedException.

Inicialmente, el enumerador se coloca antes del primer elemento de la colección. Debe llamar al método MoveNext para avanzar el enumerador al primer elemento de la colección antes de leer el valor de Current; de lo contrario, Current no está definido.

Current devuelve el mismo objeto hasta que se llama a MoveNext o Reset. MoveNext establece Current en el elemento siguiente.

Si MoveNext pasa el final de la colección, el enumerador se coloca después del último elemento de la colección y MoveNext devuelve false. Cuando el enumerador está en esta posición, las llamadas posteriores a MoveNext también devuelven false. Si la última llamada a MoveNext devuelve false, Current no está definida.

Para establecer Current en el primer elemento de la colección de nuevo, puede llamar a Reset, si se implementa, seguido de MoveNext. Si no se implementa Reset, debe crear una nueva instancia del enumerador para volver al primer elemento de la colección.

Si se realizan cambios en la colección, como agregar, modificar o eliminar elementos, el comportamiento del enumerador no está definido.

El enumerador no tiene acceso exclusivo a la colección; por lo tanto, la enumeración a través de una colección no es intrínsecamente un procedimiento seguro para subprocesos. Incluso cuando se sincroniza una colección, otros subprocesos todavía pueden modificar la colección, lo que hace que el enumerador inicie una excepción. Para garantizar la seguridad de los subprocesos durante la enumeración, puede bloquear la colección durante toda la enumeración o detectar las excepciones resultantes de los cambios realizados por otros subprocesos.

Propiedades

Current

Obtiene el elemento de la colección en la posición actual del enumerador.

Métodos

MoveNext()

Desplaza el enumerador al siguiente elemento de la colección.

Reset()

Establece el enumerador en su posición inicial, que es antes del primer elemento de la colección.

Se aplica a

Producto Versiones
.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

Consulte también