Проблема заключается в том, как вы проходите коллекцию. Использование 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);
}