我想创建一个显示递归组成员身份的简单应用程序,但不是用户而是组。因此,如果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,并且两者都将在成员列表中。现在,我希望该循环在使用应用的LDAP过滤器搜索输入组的每个成员的同时,如果找到任何组,则将其添加到成员列表和tempGroup列表中,因此每次存在嵌套组时,成员列表都会进行更新,同时将其包含在foreach循环中。如果应用程序发现没有更多的嵌套组,则tempGroup列表将为空,并且循环将停止。
但是我不断收到错误消息
的错误“ System.InvalidOperationException:'集合已被修改;枚举操作可能无法执行。”foreach (object nestedGroup in member)
我想我无法在for循环遍历它的同时修改成员列表。我在Powershell中有一个非常相似的循环,效果很好,但是我想拥有一个C#应用程序,因为我知道在这样的搜索中它可以更快。
答案 0 :(得分:3)
请勿修改您要使用<input type="button" id="the-btn" value="Do Something">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
枚举的集合。相反,您可以收集所有必须修改的内容:
foreach
答案 1 :(得分:0)
请检查以下行:
member.Add(NestedGroupMember.ToString());
执行此行可能是由于您试图将NestedGroupMember.ToString()
添加到现在位于 foreach 循环中的成员列表中而发生的错误,以解决错误与tempGroup定义一样,为此类型创建一个临时变量,然后在foreach结束后将它们加入主成员列表。
答案 2 :(得分:0)
您可以采用几种方法来解决此问题。答案中已经提到了使用临时列表的第一个。另一种方法是使用for
循环。正如我所评论的,MSDN指出以下内容:
foreach语句用于遍历集合以获取 所需的信息,但不能用于添加或删除 源集合中的项目,以避免不可预期的副作用。 如果您需要在来源集合中添加或删除项目,请使用 for循环。
现在这里缺少一些信息供您做出正确,最合适的选择。如果您使用for
循环,并在枚举期间修改列表,则枚举时添加的项目也会被枚举。
所以问自己以下问题:是否也需要枚举新添加的项目?如果是这样,请使用for
循环。如果不是,则可能要在其他地方使用这些项目,因此需要将它们存储在其他地方,例如在临时列表中。
答案 3 :(得分:0)
您正在使用foreach
,但是它不允许您修改集合。但是您可以进行反向for
循环,例如:
for (var i = list.Length - 1; i >= 0; i-- {
var item = list[i];
// TODO
}
那一定行得通。只需用与此相反的foreach
进行集合修改来替换所有for
循环。