Supprimer / Ajouter des éléments dans une liste en l'itérant

Tout d'abord, je sais que ce n'est pas possible de sortir de la boîte pour des raisons évidentes.

foreach(string item in myListOfStrings) {
    myListOfStrings.Remove(item);
}

L'aide de l'extrait ci-dessus est l'une des choses les plus horribles que j'ai jamais vu. Alors, comment voulez-vous l'atteindre? Vous pourriez parcourir la liste vers l'arrière à l'aide de formais je n'aime pas cette solution.

Ce que je me pose est: y a t-il une méthode/extensions qui renvoie un IEnumerable partir de la liste actuelle, quelque chose comme un flottant copie? LINQ a de nombreuses méthodes d'extension qui font exactement cela, mais vous avez toujours à faire quelque chose avec elle, tels que le filtrage (où, prendre...).

J'ai hâte à quelque chose comme ceci:

foreach(string item in myListOfStrings.Shadow()) {
   myListOfStrings.Remove(item);
}

où, comme .De l'ombre() est:

public static IEnumerable<T> Shadow<T>(this IEnumerable<T> source) {
    return new IEnumerable<T>(source);
    //or return source.Copy()
    //or return source.TakeAll();
}

Exemple

foreach(ResponseFlags flag in responseFlagsList.Shadow()) {
    switch(flag) {
        case ResponseFlags.Case1:
            ...
        case ResponseFlags.Case2:
            ...
    }
    ...
    this.InvokeSomeVoidEvent(flag)
    responseFlagsList.Remove(flag);
}

Solution

C'est comment je l'ai résolu, et il fonctionne comme un charme:

public static IEnumerable<T> Shadow<T>(this IEnumerable<T> source) where T: new() {
    foreach(T item in source)
        yield return item;
}

C'est pas super rapide (évidemment), mais il est sûr et exactement ce que je voulais faire.

source d'informationauteur Atrotygma