Lire en anglais

Partager via


IEnumerator<T> Interface

Définition

Prend en charge une itération simple sur une collection générique.

C#
public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator
C#
public interface IEnumerator<T> : IDisposable, System.Collections.IEnumerator

Paramètres de type

T

Type d’objets à énumérer.

Ce paramètre de type est covariant. Cela signifie que vous pouvez utiliser le type spécifié ou tout type plus dérivé. Pour plus d’informations sur la covariance et la contravariance, consultez Covariance et contravariance dans les génériques.
Dérivé
Implémente

Exemples

L’exemple suivant montre une implémentation de l’interface IEnumerator<T> pour une classe de collection d’objets personnalisés. L’objet personnalisé est une instance du type Box, et la classe de collection est BoxCollection. Cet exemple de code fait partie d’un exemple plus large fourni pour l’interface ICollection<T>.

C#

// Defines the enumerator for the Boxes collection.
// (Some prefer this class nested in the collection class.)
public class BoxEnumerator : IEnumerator<Box>
{
    private BoxCollection _collection;
    private int curIndex;
    private Box curBox;

    public BoxEnumerator(BoxCollection collection)
    {
        _collection = collection;
        curIndex = -1;
        curBox = default(Box);
    }

    public bool MoveNext()
    {
        //Avoids going beyond the end of the collection.
        if (++curIndex >= _collection.Count)
        {
            return false;
        }
        else
        {
            // Set current box to next item in collection.
            curBox = _collection[curIndex];
        }
        return true;
    }

    public void Reset() { curIndex = -1; }

    void IDisposable.Dispose() { }

    public Box Current
    {
        get { return curBox; }
    }

    object IEnumerator.Current
    {
        get { return Current; }
    }
}

Remarques

IEnumerator<T> est l’interface de base de tous les énumérateurs génériques.

L’instruction foreach du langage C# (for each en C++, For Each en Visual Basic) masque la complexité des énumérateurs. Par conséquent, l’utilisation de foreach est recommandée, au lieu de manipuler directement l’énumérateur.

Les énumérateurs peuvent être utilisés pour lire les données de la collection, mais ils ne peuvent pas être utilisés pour modifier la collection sous-jacente.

Initialement, l’énumérateur est positionné avant le premier élément de la collection. À cette position, Current n’est pas défini. Par conséquent, vous devez appeler MoveNext pour faire avancer l’énumérateur vers le premier élément de la collection avant de lire la valeur de Current.

Current retourne le même objet jusqu’à ce que MoveNext soit appelé. MoveNext définit Current à l’élément suivant.

Si MoveNext passe la fin de la collection, l’énumérateur est positionné 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 retourné false, Current n’est pas défini. Vous ne pouvez pas définir Current sur le premier élément de la collection ; vous devez créer une instance d’énumérateur à la place.

La méthode Reset est fournie pour l’interopérabilité COM. Elle n’a pas nécessairement besoin d’être implémentée ; Au lieu de cela, l’implémenteur peut simplement lever une NotSupportedException. Toutefois, si vous choisissez de le faire, vous devez vous assurer qu’aucun appelant ne s’appuie sur la fonctionnalité de Reset.

Si des modifications sont apportées à la collection, telles que l’ajout, la modification ou la suppression d’éléments, le comportement de l’énumérateur n’est pas défini.

L’énumérateur n’a pas d’accès exclusif à la collection ; par conséquent, l’énumération par le biais d’une collection n’est pas intrinsèquement une procédure thread-safe. Pour garantir la sécurité des threads pendant l’énumération, vous pouvez verrouiller la collection pendant toute l’énumération. Pour permettre à la collection d’accéder à plusieurs threads pour la lecture et l’écriture, vous devez implémenter votre propre synchronisation.

Les implémentations par défaut des regroupements dans l’espace de noms System.Collections.Generic ne sont pas synchronisées.

Notes pour les responsables de l’implémentation

L’implémentation de cette interface nécessite l’implémentation de l’interface IEnumerator non générique. Les méthodes MoveNext() et Reset() ne dépendent pas de Tet n’apparaissent que sur l’interface non générique. La propriété Current apparaît sur les deux interfaces et comporte différents types de retour. Implémentez la propriété Current non générique comme implémentation d’interface explicite. Cela permet à tout consommateur de l’interface non générique d’utiliser l’interface générique.

En outre, IEnumerator<T> implémente IDisposable, ce qui vous oblige à implémenter la méthode Dispose(). Cela vous permet de fermer les connexions de base de données ou de libérer des handles de fichiers ou des opérations similaires lors de l’utilisation d’autres ressources. S’il n’existe aucune ressource supplémentaire à supprimer, fournissez une implémentation Dispose() vide.

Propriétés

Current

Obtient l’élément de la collection à la position actuelle de l’énumérateur.

Méthodes

Dispose()

Effectue des tâches définies par l’application associées à la libération, à la libération ou à la réinitialisation des ressources non managées.

(Hérité de IDisposable)
MoveNext()

Avance l’énumérateur vers l’élément suivant de la collection.

(Hérité de IEnumerator)
Reset()

Définit l’énumérateur à sa position initiale, qui est avant le premier élément de la collection.

(Hérité de IEnumerator)

S’applique à

Produit Versions
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Voir aussi