C# 从集合中删除项(MembershipUserCollection)-可能不会执行枚举操作

C# 从集合中删除项(MembershipUserCollection)-可能不会执行枚举操作,c#,asp.net,asp.net-membership,C#,Asp.net,Asp.net Membership,我在c中使用asp.NET4和EF4。 我使用System.Web.Security来管理Web应用程序中的用户 我在MembershipUserCollection中有一个用户集合,我需要在该集合上的foreach期间删除一些用户 我认为在循环时,不可能从收集器中删除项目。 你知道怎么解决吗 请提供我的代码样本,谢谢 MembershipUserCollection users = Membership.GetAllUsers(); foreach (Member

我在c中使用asp.NET4和EF4。 我使用System.Web.Security来管理Web应用程序中的用户

我在MembershipUserCollection中有一个用户集合,我需要在该集合上的foreach期间删除一些用户

我认为在循环时,不可能从收集器中删除项目。 你知道怎么解决吗

请提供我的代码样本,谢谢

       MembershipUserCollection users = Membership.GetAllUsers();
        foreach (MembershipUser x in users)
        {
            if (!Roles.IsUserInRole(x.UserName, "CMS-AUTHOR"))
            {
                users.Remove(x.UserName);
            }
         }
错误:

Collection was modified; enumeration operation may not execute. 

无法修改正在枚举的集合。尝试使用LINQ


users.ToList.RemoveAllx=>!Roles.InUserInRolex.UserName,CMS-AUTHOR

在遍历枚举时不能修改枚举-将要删除的用户放入列表中,然后在完成枚举后删除所有用户:

   MembershipUserCollection users = Membership.GetAllUsers();
   List<string> usersToRemove = new List<string>();
   foreach (MembershipUser x in users)
   {
        if (!Roles.IsUserInRole(x.UserName, "CMS-AUTHOR"))
            usersToRemove.Add(x.UserName);
   }
   foreach(string userName in usersToRemove)
         users.Remove(userName);

问题是:在枚举集合时,不能修改集合。如果允许的话,这可能会导致各种各样的问题


集合应具有ToList、ToArray或CopyTo方法,该方法将创建集合的副本。制作一个副本并在副本上循环。然后可以修改该循环中的原始集合

我可能会这样做:

var usersToRemove = from user in users
                    where !Roles.IsUserInRole(x.UserName, "CMS-AUTHOR")
                    select user;

foreach(var u in usersToRemove)
{
   users.Remove(u);
}

我找到了解决问题的办法。 告诉我你认为什么或者是否可以更好地实施。 谢谢你抽出时间

        // Take all Users
        MembershipUserCollection users = Membership.GetAllUsers();
        // Create an empty collector for only User in Author
        MembershipUserCollection usersAuthors = new MembershipUserCollection();
        foreach (MembershipUser x in users)
        {
            if (Roles.IsUserInRole(x.UserName, "CMS-AUTHOR"))
            {
                usersAuthors.Add(x);
            }
        }

问题在于你如何处理这些收藏。使用foreach作为IEnumerable遍历集合。在IEnumerable中移动时,您所拥有的只是对当前元素的引用和将您移动到下一个元素的方法。当您更改可枚举的内容时,该过程就会出错。总是把你所收集的东西看作是不可改变的;可以更改元素的属性,但不能通过添加或删除元素来更改集合的结构

请尝试以下方法:

MembershipUserCollection users = Membership.GetAllUsers();
MembershipUserCollection deletedUsers = new MembershipUserCollection();
    foreach (MembershipUser x in users)
    {
        if (!Roles.IsUserInRole(x.UserName, "CMS-AUTHOR"))
        {
            deletedUsers.Add(x);
        }
     }

foreach(MembershipUser delete in deletedUsers)
{
    users.Remove(delete);
}
区别在于您没有更改正在枚举的集合。您可以使用一点Linq来简化此过程:

MembershipUserCollection users = Membership.GetAllUsers();
//the difference is that the Select method creates a new enumerable that isolates changes to its source
foreach (MembershipUser x in users.Cast<MembershipUser>().Select(z=>!Roles.IsUserInRole(z.UserName, "CMS-AUTHOR")))
{
    users.Remove(z);
}

您好,我尝试了您的第一个代码,我也遇到了同样的问题,我想问题出在users.Removex中。UserName@GlbboK:有一行我忘了带出去-如果现在可以工作,在我意识到有问题之前投票-这只会从临时列表中删除用户,但不是从用户的收集,这是OPC的意图感谢您的解释,您的第一个代码帮助很大。unfotunaelly我可以将Linq与System.Web.security一起使用如果可以在集合上使用foreach,则可以使用Linq。您只需要将集合从非泛型转换为泛型,因为MembershipUserCollection类型当前仅实现非泛型IEnumerable。您可以通过对集合调用of type或Cast来完成此操作。
MembershipUserCollection users = Membership.GetAllUsers();
//the difference is that the Select method creates a new enumerable that isolates changes to its source
foreach (MembershipUser x in users.Cast<MembershipUser>().Select(z=>!Roles.IsUserInRole(z.UserName, "CMS-AUTHOR")))
{
    users.Remove(z);
}