Movatterモバイル変換


[0]ホーム

URL:


Skip to main contentSkip to in-page navigation

This browser is no longer supported.

Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.

Download Microsoft EdgeMore info about Internet Explorer and Microsoft Edge
Table of contentsExit focus mode

IEnumerator Interface

Definition

Namespace:
System.Collections
Assemblies:
mscorlib.dll, System.Runtime.dll
Assemblies:
netstandard.dll, System.Runtime.dll
Assembly:
System.Runtime.dll
Assembly:
mscorlib.dll
Assembly:
netstandard.dll
Source:
IEnumerator.cs

Important

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

Supports a simple iteration over a non-generic collection.

public interface class IEnumerator
public interface IEnumerator
[System.Runtime.InteropServices.Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")]public interface IEnumerator
[System.Runtime.InteropServices.Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")][System.Runtime.InteropServices.ComVisible(true)]public interface IEnumerator
type IEnumerator = interface
[<System.Runtime.InteropServices.Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")>]type IEnumerator = interface
[<System.Runtime.InteropServices.Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")>][<System.Runtime.InteropServices.ComVisible(true)>]type IEnumerator = interface
Public Interface IEnumerator
Derived
Attributes

Examples

The following code example demonstrates the implementation of theIEnumerable andIEnumerator interfaces for a custom collection. In this example, members of these interfaces are not explicitly called, but they are implemented to support the use offoreach (for each in Visual Basic) to iterate through the collection.

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 * */
Imports System.Collections' Simple business object.Public Class Person    Public Sub New(ByVal fName As String, ByVal lName As String)        Me.firstName = fName        Me.lastName = lName    End Sub    Public firstName As String    Public lastName As StringEnd Class' Collection of Person objects, which implements IEnumerable so that' it can be used with ForEach syntax.Public Class People    Implements IEnumerable    Private _people() As Person    Public Sub New(ByVal pArray() As Person)        _people = New Person(pArray.Length - 1) {}        Dim i As Integer        For i = 0 To pArray.Length - 1            _people(i) = pArray(i)        Next i    End Sub    ' Implementation of GetEnumerator.    Public Function GetEnumerator() As IEnumerator _      Implements IEnumerable.GetEnumerator        Return New PeopleEnum(_people)    End FunctionEnd Class' When you implement IEnumerable, you must also implement IEnumerator.Public Class PeopleEnum    Implements IEnumerator    Public _people() As Person    ' Enumerators are positioned before the first element    ' until the first MoveNext() call.    Dim position As Integer = -1    Public Sub New(ByVal list() As Person)        _people = list    End Sub    Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext        position = position + 1        Return (position < _people.Length)    End Function    Public Sub Reset() Implements IEnumerator.Reset        position = -1    End Sub    Public ReadOnly Property Current() As Object Implements IEnumerator.Current        Get            Try                Return _people(position)            Catch ex As IndexOutOfRangeException                Throw New InvalidOperationException()            End Try        End Get    End PropertyEnd ClassClass App    Shared Sub Main()        Dim peopleArray() As Person = { _            New Person("John", "Smith"), _            New Person("Jim", "Johnson"), _            New Person("Sue", "Rabon")}        Dim peopleList As New People(peopleArray)        Dim p As Person        For Each p In peopleList            Console.WriteLine(p.firstName + " " + p.lastName)        Next    End SubEnd Class' This code produces output similar to the following:' ' John Smith' Jim Johnson' Sue Rabon

Remarks

IEnumerator is the base interface for all non-generic enumerators. Its generic equivalent is theSystem.Collections.Generic.IEnumerator<T> interface.

Theforeach statement of the C# language (for each in Visual Basic) hides the complexity of the enumerators. Therefore, usingforeach is recommended instead of directly manipulating the enumerator.

Enumerators can be used to read the data in the collection, but they cannot be used to modify the underlying collection.

TheReset method is provided for COM interoperability and does not need to be fully implemented; instead, the implementer can throw aNotSupportedException.

Initially, the enumerator is positioned before the first element in the collection. You must call theMoveNext method to advance the enumerator to the first element of the collection before reading the value ofCurrent; otherwise,Current is undefined.

Current returns the same object until eitherMoveNext orReset is called.MoveNext setsCurrent to the next element.

IfMoveNext passes the end of the collection, the enumerator is positioned after the last element in the collection andMoveNext returnsfalse. When the enumerator is at this position, subsequent calls toMoveNext also returnfalse. If the last call toMoveNext returnedfalse,Current is undefined.

To setCurrent to the first element of the collection again, you can callReset, if it's implemented, followed byMoveNext. IfReset is not implemented, you must create a new enumerator instance to return to the first element of the collection.

If changes are made to the collection, such as adding, modifying, or deleting elements, the behavior of the enumerator is undefined.

The enumerator does not have exclusive access to the collection; therefore, enumerating through a collection is intrinsically not a thread-safe procedure. Even when a collection is synchronized, other threads can still modify the collection, which causes the enumerator to throw an exception. To guarantee thread safety during enumeration, you can either lock the collection during the entire enumeration or catch the exceptions resulting from changes made by other threads.

Properties

Current

Gets the element in the collection at the current position of the enumerator.

Methods

MoveNext()

Advances the enumerator to the next element of the collection.

Reset()

Sets the enumerator to its initial position, which is before the first element in the collection.

Applies to

See also

Collaborate with us on GitHub
The source for this content can be found on GitHub, where you can also create and review issues and pull requests. For more information, seeour contributor guide.

Feedback

Was this page helpful?

YesNo

In this article

Was this page helpful?

YesNo