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]);