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);
我正在删除 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);