[英]C# do..while loop for a list
我想创建一个显示递归组成员资格的简单应用程序,但不是用户而是组。 因此,如果groupA将groupB作为成员并且groupB将groupC作为成员,我希望代码向我显示嵌套到最后一个的所有组。 以下是我的样本:
if (member.Any())
{
List<string> tempGroup = new List<string>();
do
{
tempGroup.Clear();
foreach (object nestedGroup in member)
{
SearchResult NestedGroupMemberResult = null;
try
{
string NestedgroupMemberSearchFilter = "(&(objectClass=group)(distinguishedName=" + nestedGroup.ToString() + "))";
string NestedgroupMemberPropertise = "member,distinguishedName";
NestedGroupMemberResult = dirSearcher(NestedgroupMemberSearchFilter, NestedgroupMemberPropertise);
}
catch { }
if(NestedGroupMemberResult.Properties["member"].Count > 0)
{
foreach (object NestedGroupMember in NestedGroupMemberResult.Properties["member"])
{
member.Add(NestedGroupMember.ToString());
tempGroup.Add(NestedGroupMember.ToString());
}
}
}
} while (!tempGroup.Any());
}
listBox1.DataSource = member;
基本上成员是包含来自输入组的组成员的列表。 让我们说我最初放了GroupA,它有成员GroupB和GroupC,两者都在成员列表中。 现在我想要循环do..while搜索输入组的每个成员使用LDAP过滤器,如果它找到任何组将它添加到成员列表和tempGroup列表,所以每次有一个嵌套组,成员列表将更新,同时它将包含在foreach循环中。 如果app发现没有更多嵌套组,则tempGroup列表将为空并且循环将停止。
但是我经常收到错误“System.InvalidOperationException:'Collection was modified;枚举操作可能无法执行。'”
foreach (object nestedGroup in member)
而且我想我无法修改成员列表,而for循环正在迭代它。 我在powershell中有非常类似的循环,效果很好,但我想要一个c#app,因为我知道在这样的搜索中它可以更快。
不要修改使用foreach
枚举的集合。 相反,您可以收集所有必须修改的内容:
List<Object> addMembers = new List<Object>();
foreach (object nestedGroup in member)
{
// ...
foreach (object NestedGroupMember in NestedGroupMemberResult.Properties["member"])
{
addMembers.Add(NestedGroupMember.ToString());
//...
}
}
// ...
}
addMembers.ForEach(member.Add);
请检查以下行: member.Add(NestedGroupMember.ToString());
执行此行时可能发生错误,因为您尝试将NestedGroupMember.ToString()
添加到现在位于foreach循环中的成员列表中,解决错误只是为此类型创建临时变量,就像tempGroup定义一样,然后将它们连接到main foreach结束后的成员列表。
您可以采取一些方法来解决此问题。 第一个,使用临时列表,已经在答案中提到。 另一种方法是使用for
-loop。 正如我评论的那样, MSDN声明如下:
foreach语句用于迭代集合以获取所需的信息,但不能用于添加或删除源集合中的项目以避免不可预测的副作用。 如果需要在源集合中添加或删除项目,请使用for循环。
现在,这里缺少一些信息,供您做出正确,最合适的选择。 如果使用for
-loop,并在枚举期间修改列表, 则枚举时添加的项也将被枚举 。
所以问问自己以下问题:新添加的项目是否也需要枚举? 如果是这样,请使用for
-loop。 如果没有,您可能希望在其他地方使用这些项目,因此您需要将它们存储在其他位置,例如,在临时列表中。
您正在使用foreach
,但它不允许您修改集合。 但你可以做一个反向for
循环,如:
for (var i = list.Length - 1; i >= 0; i-- { var item = list[i]; // TODO }
那必须奏效。 只需将所有foreach
循环替换为集合修改,并将其反转for
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.