2011-11-16 1 views
3

J'ai créé une collection personnalisée qui implémente IEnumerable(T) et une personnalisation IEnumerator(T).Implémentation Iterator personnalisée C# - empêche la modification de la collection pendant la boucle foreach

J'ai aussi ajouté une méthode Add() à la collection personnalisée qui ressemble à ceci:

public void Add(T item) 
{ 
    T[] tempArray = new T[_array.Length + 1]; 

    for (int i = 0; i < _array.Length; i++) 
    { 
     tempArray[i] = _array[i]; 
    } 

    tempArray[_array.Length] = item; 

    _array = tempArray; 
    tempArray = null; 
} 

La mise en œuvre est basée sur cet exemple http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspx.

Lorsque je fais une boucle foreach avec mon tableau, je voudrais empêcher la modification de la collection (comme appeler Add() à l'intérieur de la boucle) et lancer une nouvelle InvalidOperationException. Comment serais-je capable de faire ça?

Répondre

5

Vous devez posséder un ID de version dans votre classe. Incrémentez-le à l'entrée Add. Lorsque vous créez un itérateur (dans l'appel GetEnumerator()), vous vous souvenez du numéro de version - et à chaque itération, vous vérifiez si le numéro de version est toujours ce qu'il était au début, en lançant autrement.

+0

Merci Jon. Une solution vraiment simple. Cela semble un peu évident maintenant. =) – Spalatum

4

Vous pouvez ajouter un champ à votre collection que vous pouvez incrémenter à chaque modification de la collection. Lorsque l'énumérateur est créé, vous stockez la valeur de ce champ dans l'énumérateur. Lorsque l'énumérateur est utilisé, vous vérifiez que la valeur actuelle du champ est la même que la valeur stockée lors de la création de l'énumérateur. Sinon, vous lancez un InvalidOperationException.

1

Vous pouvez utiliser une liste au lieu d'un tableau temporaire dans votre code et cela va quand même lancer InvalidOperationException par défaut. Deuxièmement, vous pourriez obtenir en utilisant la version générique de IEnumerable et vous ne devrez pas faire le travail difficile de créer un itérateur personnalisé.

Questions connexes