2011-07-27 6 views
0

possible en double:
Collection was modified; enumeration operation may not execute - why?La collection a été modifiée; l'opération d'énumération ne peut pas exécuter

Tout d'abord, je crois que ce n'est pas une double question, que le contexte traite ici des méthodes d'extension. Je reçois cette exception lorsque je déplace des éléments d'une liste à une autre via une méthode Extension, et je suis un peu confus parce que la liste dont je supprime des éléments n'est pas la liste que je suis en train d'itérer.

Par exemple, la méthode d'extension au minimum ressemblerait à ceci:

public static void MoveItemsTo(this IList source, IList target, IList items) 
{ 
    foreach (var item in items) { 
     target.Add(item); 
     source.Remove(item); 
    } 
} 

Ceci est la méthode est alors appelé comme ceci:

myCollectionOne.MoveItemsTo(myCollectionTwo, itemsToMove); 

Je ne reçois que l'erreur si je tente de supprimer l'élément de la liste source ... C'est un peu déroutant que la méthode itère sur une liste différente. Quelque chose doit se passer dans les coulisses que je ne connais pas ...

+1

il est une méthode d'extension ne fait aucune différence que ce soit ... –

+0

Quels sont les trois arguments dans un exemple qui montre cela? –

+0

Quelle erreur? Quelle exception? –

Répondre

0

Au lieu d'utiliser une boucle foreach, utilisez une boucle normale. Vous supprimez actuellement un élément de la liste des éléments, puisque c'est ce que vous répétez.

for (int i = 0; i < items.Count; i++) 
{ 
    target.Add(item); 
    source.Remove(source[i]); 
} 

Sur une note côté, vous pourriez probablement effacer toute la liste source en une seule fois après la boucle, si tel est bien ce que vous essayez d'accomplir.

0

Cela retournera une nouvelle liste qui est le résultat du déplacement de l'élément de la source à la destination, sans modifier les listes de sources. Ceci évite le problème de référence dans la question en traitant les listes de sources comme des listes immuables.

void Main() 
{ 
    var a = new List<string>() { "a","b","c" }; 
    var b = new List<string>() { "d" }; 
    var c = a.MoveItemsTo(i=>i=="b",b); 
    c.Dump(); // { "d", "b" } 
} 

public static class Extensions 
{ 
    public static IEnumerable<T> MoveItemsTo<T>(this IEnumerable<T> source, Func<T,bool> Predicate,IEnumerable<T> DestSource) 
    { 
     var newList = new List<T>(DestSource); 
     newList.AddRange(source.Where(Predicate).ToList()); 
     return newList; 
    } 
} 
Questions connexes