ERROR: Collection was modified; enumeration operation may not execute. Other solutions are not working for me

ERROR: Collection was modified; enumeration operation may not execute. Other solutions are not working for me

我正在删除 Sharepoint 网站中的用户,但出现此错误。 这是我的代码:

foreach (SPUser user in users) 
{
    string user_name = user.LoginName;

    string[]username = user_name.Split('\');
    user_name = username[1].ToString().ToLower();


    bool exists= checkIfExists(user_name);
    if (exists != true)
    {

        users.Remove(user.LoginName);
    }
}

我读过类似的问题,但我发现的解决方案对我不起作用,因为我不能使用 ToList() 或 ToArray() 方法。

如果您不能直接使用 ToList() 或 ToArray(),请创建一个新列表并将 users 中的项目添加到其中,然后在 foreach 循环中使用该新列表

尽管您的 users 实现了 IEnumerable 接口(否则您将无法在 foreach 循环中使用它),但 ToArray() 是解决问题的首选方法你的问题。也许您不能使用 ToArray() 因为实现不是通用的?在这种情况下尝试 users.OfType<SPUser>().ToArray()

假设你的 collection 真的 太大了(然后你不能使用 ToArray()ToList(),我不能看到你必须避免它们的任何其他原因或通过 .Cast<SPUser>().ToArray() 如果它没有实现 IEnumerable<SPUser> 但只有 IEnumerable) 然后首先创建一个 collection您必须删除的项目:

    var usersToRemove = new List<SPUser>();
    foreach (var user in users) {
        string user_name = user.LoginName;

        string[]username = user_name.Split('\');
        user_name = username[1].ToString().ToLower();

        if (!checkIfExists(user_name))
            usersToRemove.Add(user.LoginName);
    }
}

现在您可以安全地迭代 itemsToRemove collection 因为您枚举了 usersToRemove 但您更改了用户:

foreach (var userToRemove in usersToRemove)
    users.Remove(userToRemove);

编辑 总结一下:如果可能,将用户转换为数组(使用 users.ToArray() 或使用 users.Cast<SPUser>().ToArray() 如果它没有实现 IEnumerable<SPUser>):

foreach (var user in users.ToArray()) {

或:

foreach (var user in users.Cast<SPUser>().ToArray()) {

如果不可能,则创建一个面 collection,您将在其中放置要删除的项目,然后遍历它:

var usersToRemove = users
    .Select(x => x.Split('\')[1].ToLower())
    .Where(x => !checkIfExists(x))
    .ToArray();

foreach var userToRemove in usersToRemove)
    users.Remove(userToRemove);