Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Removing an Entity from an EntitySet during Iteration

I've got this code... seems nice and elegant, but apparently the framework don't like it when i mess with a collection while iterating through it:

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    
//...    
}    
}

The error it throws when it iterates to the 2nd object in the collection is: "EntitySet was modified during enumeration"

I know i could create a new collection of KitGroup objects (or even just IDs) that i want to remove, and then another loop afterwards to loop through these, and remove them from the collection, but this just seems like unnecessary extra code... can anybody suggest a more elegant way of achieving the same thing?

like image 543
Jeeby Avatar asked Dec 05 '22 02:12

Jeeby


1 Answers

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    
 //...    
 }    
}

or if KitGroups is of type List<T> already...

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    
    //...    
}

You can also use this second method on another IEnumerable<T> if you want to define the RemoveAll() behavior with an extension method. Be sure you don't try to use the RemoveAll() on a LINQ entity table because the inKitGroupExclusion.Contains() won't get translated into SQL.

Edit: just realized that it's not a list, just an EntitySet, so you will need to go with the first method.

like image 76
Jake Avatar answered Dec 22 '22 15:12

Jake