我有这个代码......看起来很漂亮和优雅,但显然框架不喜欢它,当我在迭代它时弄乱了一个集合:
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
//...
}
}
它迭代到集合中的第二个对象时抛出的错误是: “在枚举期间修改了EntitySet”
我知道我可以创建一个我想删除的KitGroup对象的新集合(甚至只是ID),然后是另一个循环来循环遍历这些对象,并从集合中删除它们,但这似乎是不必要的额外的代码......任何人都可以建议一种更优雅的方法来实现同样的目标吗?
答案 0 :(得分: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
//...
}
}
或者KitGroups的类型List<T>
已经......
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
//...
}
如果要使用扩展方法定义IEnumerable<T>
行为,也可以在另一个RemoveAll()
上使用此第二种方法。请确保您不要尝试在LINQ实体表上使用RemoveAll()
,因为inKitGroupExclusion.Contains()
不会被转换为SQL。
编辑:刚才意识到它不是一个列表,只是一个EntitySet
,所以你需要使用第一种方法。