Assembly : mscorlib (dans mscorlib.dll)
Syntaxe<ComVisibleAttribute(True)> _ <GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")> _ Public Interface IEnumerator
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
ComVisibleAttribute(true) GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A") public interface IEnumerator
NotesIEnumerator 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.
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 l'énumérateur directement.
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 est à 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 aussi longtemps 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. Afin de 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.
ExempleL'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]; } } public IEnumerator 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 * */
Plates-formesWindows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile pour Pocket PC, Windows Mobile pour Smartphone, Windows Server 2003, Windows XP Édition Media Center, Windows XP Professionnel Édition x64, Windows XP SP2, Windows XP Starter Edition
Le .NET Framework ne prend pas en charge toutes les versions de chaque plate-forme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise.
Outils (masquer)
S'enregistrer
Liste des Membres
Qui est en ligne?
FAQ