2010-06-02 3 views
2

J'ai ce code ... semble agréable et élégant, mais apparemment le cadre ne l'aime pas quand je mess avec une collection tout en réitérant à travers elle:Suppression d'une entité d'un EntitySet pendant Iteration

foreach (KitGroup kg in ProductToTransfer.KitGroups)  
{  
// Remove kit groups that have been excluded by the user  
if (inKitGroupExclusions != null && inKitGroupExclusions.Contains(kg.KitGroupID))  
    ProductToTransfer.KitGroups.Remove(kg);  
else  
{  
// Loop through the kit items and do other stuff  
//...  
}  
} 

l'erreur qu'il jette quand il itère au 2ème objet de la collection est: « EntitySet a été modifié lors de l'énumération »

Je sais que je pourrais créer une nouvelle collection d'objets KITGroup (ou même simplement ID) que je veux pour supprimer, puis une autre boucle pour ensuite passer à travers ceux-ci, et les retirer de la collection, mais cela semble juste inutile xtra code ... quelqu'un peut-il suggérer un moyen plus élégant de réaliser la même chose?

Répondre

12
foreach (KitGroup kg in ProductToTransfer.KitGroups.ToList())  
{  
// Remove kit groups that have been excluded by the user  
if (inKitGroupExclusions != null && inKitGroupExclusions.Contains(kg.KitGroupID))  
    ProductToTransfer.KitGroups.Remove(kg);  
else  
{  
// Loop through the kit items and do other stuff  
//...  
}  
} 

ou si KitGroups est de type List<T> déjà ...

if(inKitGroupExclusion != null) 
    ProductToTransfer.KitGroups.RemoveAll(x => inKitGroupExclusion.Contains(x)); 
foreach (KitGroup kg in ProductToTransfer.KitGroups)  
{  
    // Loop through the kit items and do other stuff  
    //...  
} 

Vous pouvez également utiliser cette deuxième méthode sur une autre IEnumerable<T> si vous souhaitez définir le comportement RemoveAll() avec une méthode d'extension. Assurez-vous que vous n'essayez pas d'utiliser le RemoveAll() sur une table d'entités LINQ car le inKitGroupExclusion.Contains() ne sera pas traduit en SQL. Edit: juste réalisé que ce n'est pas une liste, juste un EntitySet, donc vous devrez utiliser la première méthode.

+0

Wow génial ... tout ce que je devais faire était de le convertir en liste. Donc, c'est juste parce que c'était un EntitySet que je ne pouvais pas supprimer les éléments de la collection dans une énumération ... pourquoi est-ce? Merci beaucoup, je savais qu'il y aurait une solution facile à ce probleM :) – Jeeby

+2

@Gregorius Ce n'est pas le fait que c'est un 'EntitySet', c'est le fait que vous supprimez de l'objet que vous êtes en train d'énumérer. L'appel de 'ToList' instancie un nouvel objet' List' à énumérer pendant que vous supprimez le 'EntitySet' d'origine. Vous devez utiliser le même type de procédure pour supprimer des éléments d'une liste ou d'une autre collection. – Jake

+0

ahhh ... c'est tout à fait logique. merci Jake, très apprécié – Jeeby

Questions connexes