Asp.net mvc 如何克服此错误:-已修改集合;枚举操作不能执行;
我有以下方法:-Asp.net mvc 如何克服此错误:-已修改集合;枚举操作不能执行;,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我有以下方法:- public void AssignGroupRole(int id, int[] selectedGroups, int[] currentGroups) { var roleGroups = FindRole(id).Groups; var roleGroupsCopy = roleGroups; var securityRole = FindRole(id);
public void AssignGroupRole(int id, int[] selectedGroups, int[] currentGroups)
{
var roleGroups = FindRole(id).Groups;
var roleGroupsCopy = roleGroups;
var securityRole = FindRole(id);
foreach (var group in roleGroupsCopy)
{
if (currentGroups != null)
{
for (int c = 0; c < currentGroups.Count(); c++)
{
if (group.GroupID == currentGroups[c])
{
securityRole.Groups.Remove(group);
}
}
}
}
关于如何克服此错误,您有何建议?您可以使用:
foreach (var group in roleGroupsCopy.ToList())
调用ToList()会将其复制到一个临时列表中,并在其中循环。临时列表将不会被修改
另一种方法是使用:
securityRole.Groups.RemoveAll(g => g.GroupID == currentGroups[c]);
使用
for
循环,而不是foreach
。请看
它说:
foreach语句用于遍历集合以获取
所需信息,但不应用于更改内容
以避免不可预知的副作用
谢谢你的回复,但是为什么ti应该使用循环呢?导致此错误的原因是什么?请参见编辑,您的角色组合正在被修改的某个地方导致此错误。感谢您的回复,但我的角色组合没有被修改,因为我只是在重复它?@johnG:您正在修改它,因为
securityRole.Groups==roleGroupsCopy==roleGroups
。这些只是对同一集合的三个引用(“指针”),而不是集合的副本。这里的术语修改还包括删除元素。此行修改角色组集合:securityRole.Groups.Remove(group);由于roleGroupsCopy=securityRole.groups,您甚至不需要roleGroupsCopy。只需使用roleGroups.ToList()。
securityRole.Groups.RemoveAll(g => g.GroupID == currentGroups[c]);