Énumération d'une collection

Le .NET Framework fournit des énumérateurs comme méthode pratique pour l'itération au sein d'une collection. Les énumérateurs ne peuvent lire que les données de la collection ; ils ne peuvent pas être utilisés pour modifier la collection sous-jacente.

Certains langages fournissent une instruction qui masque la complexité de l'utilisation directe des énumérateurs. L'instruction foreach C#, l'instruction for each C++ et l'instruction For Each Visual Basic utilisent des énumérateurs.

À propos des énumérateurs

Un énumérateur met à plat une collection de façon à rendre possible un accès séquentiel à ses membres. Les classes de collection n'ont pas toutes les mêmes séquences. Par exemple, un énumérateur pour ArrayList conserve l'ordre dans lequel les éléments sont entrés dans la collection, alors qu'un énumérateur pour Hashtable affiche les éléments selon le code de hachage de l'élément.

Chaque énumérateur repose sur l'interface IEnumerator ou sur l'interface générique IEnumerator<T>, qui requiert les membres suivants :

  • La propriété Current désigne le membre actuel dans la collection.

  • La propriété MoveNext déplace l'énumérateur vers le membre suivant dans la collection.

  • La propriété Reset remet l'énumérateur au début de la collection. Current est positionnée avant le premier élément. La réinitialisation est non disponible dans l'interface générique IEnumerator<T>.

Comportement d'un énumérateur

L'énumérateur est initialement positionné avant le premier élément de la collection. Reset ramène aussi l'énumérateur à cette position. À cette position, Current n'est pas défini. Par conséquent, vous devez appeler 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 jusqu'à ce que MoveNext ou Reset soit appelée. MoveNext affecte Current à l'élément suivant.

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, Current n'est pas défini.

Dans les collections non génériques, vous pouvez appeler Reset, puis MoveNext pour déplacer l'énumérateur au début de la collection.

Dans les collections génériques, vous ne pouvez pas affecter de nouveau à Current le premier élément de la collection ; vous devez créer à la place une nouvelle instance de l'énumérateur.

Un énumérateur reste valide tant que la collection reste 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 son comportement n'est pas défini.

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. Pour garantir la sécurité des threads pendant l'énumération, vous pouvez verrouiller la collection pendant toute la durée de cette opération. Pour permettre à plusieurs threads d'accéder en lecture et en écriture à la collection, vous devez implémenter votre propre synchronisation ou utiliser l'une des classes de collection thread-safe de l'espace de noms System.Collections.Concurrent. Les classes System.Collections.Concurrent.ConcurrentStack<T> et System.Collections.Concurrent.ConcurrentQueue<T> prennent un instantané des éléments avant de les énumérer, pour empêcher des mutations à la collection sur un autre thread. La classe System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue> n'effectue pas d'instantané.

La classe System.Collections.Concurrent.BlockingCollection<T> fournit une méthode d'énumérateur appelée GetConsumingEnumerable qui transforme la collection en supprimant les éléments de la collection à mesure qu'elle les énumère.

Voir aussi

Référence

IEnumerator

IEnumerator<T>

IDictionaryEnumerator

IEnumerable

IEnumerable<T>

Concepts

Collections thread-safe

Autres ressources

Création et manipulation de collections