Mise à jour : novembre 2007
Prend en charge une itération simple sur une collection non générique.
Espace de noms :
System.Collections Assembly :
mscorlib (dans mscorlib.dll)
Visual Basic (Déclaration)
<ComVisibleAttribute(True)> _
<GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")> _
Public Interface IEnumerator
Visual Basic (Utilisation)
Dim instance As IEnumerator
[ComVisibleAttribute(true)]
[GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerator
[ComVisibleAttribute(true)]
[GuidAttribute(L"496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface class IEnumerator
/** @attribute ComVisibleAttribute(true) */
/** @attribute GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A") */
public interface IEnumerator
public interface IEnumerator
IEnumerator est l'interface de base pour tous les énumérateurs non génériques.
Pour la version générique de cette interface, consultez IEnumerator<(Of <(T>)>).
L'instruction foreach du langage C# (for each en Visual Basic) cache la complexité des énumérateurs. Il est donc recommandé d'utiliser foreach plutôt que de manipuler directement l'énumérateur.
Les énumérateurs peuvent être utilisés pour lire les données d'une collection, mais ils ne permettent pas de modifier la collection sous-jacente.
L'énumérateur est initialement positionné avant le premier élément de la collection. La méthode Reset ramène aussi l'énumérateur à cette position. À cette position, un appel à la propriété Current lève une exception. Par conséquent, vous devez appeler la méthode MoveNext pour avancer l'énumérateur au premier élément de la collection avant la lecture de la valeur de Current.
Current retourne le même objet tant que MoveNext ou Reset n'est pas appelé. MoveNext affecte l'élément suivant à Current.
Si MoveNext passe la fin de la collection, l'énumérateur est placé après le dernier élément de la collection et MoveNext retourne false. Lorsque l'énumérateur se trouve à cette position, les appels suivants à MoveNext retournent également false. Si le dernier appel à MoveNext a retourné false, l'appel à Current lève une exception. Pour affecter à nouveau le premier élément de la collection comme valeur de Current, vous pouvez appeler Reset, puis MoveNext.
Un énumérateur reste valide tant que la collection demeure inchangée. Si la collection est modifiée en ajoutant, modifiant ou supprimant des éléments, l'énumérateur devient irrévocablement non valide et le prochain appel à MoveNext ou à Reset lève InvalidOperationException. Si la collection est modifiée entre MoveNext et Current, Current retourne l'élément défini comme sa valeur, même si l'énumérateur est déjà non valide.
L'énumérateur ne dispose pas d'un accès exclusif à la collection. Par conséquent, l'énumération d'une collection n'est intrinsèquement pas une procédure thread-safe. Même lorsqu'une collection est synchronisée, les autres threads peuvent toujours modifier la collection, ce qui entraîne la levée d'une exception par l'énumérateur. Pour garantir la sécurité des threads au cours de l'énumération, vous pouvez soit verrouiller la collection pendant l'ensemble de l'énumération, soit intercepter les exceptions résultant des modifications apportées par les autres threads.
L'exemple de code suivant illustre l'implémentation des interfaces IEnumerable et IEnumerator pour une collection personnalisée. Dans cet exemple, les membres de ces interfaces ne sont pas appelés explicitement, mais sont implémentés pour prendre en charge l'utilisation de foreach (for each en Visual Basic) pour parcourir la collection.
Imports System
Imports System.Collections
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 String
End Class
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
Public Function GetEnumerator() As IEnumerator _
Implements IEnumerable.GetEnumerator
Return New PeopleEnum(_people)
End Function
End Class
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 Property
End Class
Class 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 Sub
End Class
' This code produces output similar to the following:
'
' John Smith
' Jim Johnson
' Sue Rabon
using System;
using System.Collections;
public class Person
{
public Person(string fName, string lName)
{
this.firstName = fName;
this.lastName = lName;
}
public string firstName;
public string lastName;
}
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];
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return new PeopleEnum(_people);
}
}
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;
}
public object 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
*
*/
Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professionnel Édition x64, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile pour Smartphone, Windows Mobile pour Pocket PC, Xbox 360
Le .NET Framework et le .NET Compact Framework ne prennent pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.
.NET Framework
Pris en charge dans : 3.5, 3.0, 2.0, 1.1, 1.0
.NET Compact Framework
Pris en charge dans : 3.5, 2.0, 1.0
XNA Framework
Pris en charge dans : 2.0, 1.0
Référence