繁体   English   中英

C#do..while循环列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM