This browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Note
Access to this page requires authorization. You can trysigning in orchanging directories.
Access to this page requires authorization. You can trychanging directories.
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
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
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.
Current | Gets the element in the collection at the current position of the enumerator. |
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. |
Was this page helpful?
Was this page helpful?