C# 错误:集合已修改;枚举操作不能执行。其他解决方案对我不起作用
我正在删除Sharepoint网站中的用户,因此出现此错误。 这是我的密码:C# 错误:集合已修改;枚举操作不能执行。其他解决方案对我不起作用,c#,sharepoint,foreach,C#,Sharepoint,Foreach,我正在删除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_nam
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(),请创建一个新列表,并将用户的项目添加到该列表中,然后在foreach
循环中使用该新列表
虽然很明显,您的用户
实现了IEnumerable
接口(否则您将无法在foreach循环中使用它),但ToArray()是解决问题的首选方法。也许您不能使用ToArray(),因为实现不是泛型的?在这种情况下,请尝试users.OfType().ToArray()
假设您的收藏真的太大了(然后您不能使用ToArray()
或ToList()
,我看不出您必须避免它们或通过.Cast().ToArray()的任何其他原因)
如果它没有实现IEnumerable
,但只实现IEnumerable
),那么首先创建一个必须删除的项目集合:
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);
}
}
编辑进行总结:如果可能,将用户转换为数组(使用users.ToArray()
或使用users.Cast().ToArray()
,如果未实现IEnumerable
):
或:
为什么不能使用ToList
或ToArray
?你尝试了什么,失败了什么?
foreach (var userToRemove in usersToRemove)
users.Remove(userToRemove);
foreach (var user in users.ToArray()) {
foreach (var user in users.Cast<SPUser>().ToArray()) {
var usersToRemove = users
.Select(x => x.Split('\\')[1].ToLower())
.Where(x => !checkIfExists(x))
.ToArray();
foreach var userToRemove in usersToRemove)
users.Remove(userToRemove);