C#do..while循环获取列表

时间:2018-11-15 09:31:44

标签: c# .net list do-while

我想创建一个显示递归组成员身份的简单应用程序,但不是用户而是组。因此,如果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#应用程序,因为我知道在这样的搜索中它可以更快。

4 个答案:

答案 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循环。