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?
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.
精彩评论