Ne pouvez pas ajouter/supprimer des éléments d'une collection tout en foreach est une itération sur elle

Si je fais ma propre mise en œuvre de IEnumerator l'interface, puis je suis capable ( à l'intérieur de foreach déclaration )pour ajouter ou supprimer des éléments à partir d'un albumsList sans générer une exception.Mais si foreach instruction utilise IEnumerator fourni par albumsList, puis d'essayer d'ajouter/supprimer ( à l'intérieur de la boucle foreach )des éléments de albumsList entraînera exception:

class Program
{
static void Main(string[] args)
{
string[] rockAlbums = { "rock", "roll", "rain dogs" };
ArrayList albumsList = new ArrayList(rockAlbums);
AlbumsCollection ac = new AlbumsCollection(albumsList);
foreach (string item in ac)
{
Console.WriteLine(item);
albumsList.Remove(item);  //works
}
foreach (string item in albumsList)
{
albumsList.Remove(item); //exception
}
}
class MyEnumerator : IEnumerator
{
ArrayList table;
int _current = -1;
public Object Current
{
get
{
return table[_current];
}
}
public bool MoveNext()
{
if (_current + 1 < table.Count)
{
_current++;
return true;
}
else
return false;
}
public void Reset()
{
_current = -1;
}
public MyEnumerator(ArrayList albums)
{
this.table = albums;
}
}
class AlbumsCollection : IEnumerable
{
public ArrayList albums;
public IEnumerator GetEnumerator()
{
return new MyEnumerator(this.albums);
}
public AlbumsCollection(ArrayList albums)
{
this.albums = albums;
}
}
}

a) je suppose code qui lève une exception ( lors de l'utilisation de IEnumerator mise en œuvre A fourni par albumsList ) est situé à l'intérieur de A?

b) Si je veux être en mesure d'ajouter ou de supprimer des éléments d'une collection ( tout en foreach est une itération sur elle), ai-je toujours besoin de fournir mon propre mise en œuvre de IEnumerator interface, ou peut albumsList être configuré pour autoriser l'ajout/suppression d'éléments?

merci

OriginalL'auteur flockofcode | 2010-06-14