【问题标题】:Collect results from recursive call从递归调用中收集结果
【发布时间】:2016-12-20 20:45:56
【问题描述】:

大家好,我在从递归函数调用中获取正确结果时遇到了麻烦

这就是我所拥有的

 public IEnumerable<AdProfileDto> GetAdProfilesByGroup(string groupDisplayName)
        {
            if (!string.IsNullOrEmpty(groupDisplayName))
            {
                IList<AdProfileDto> adProfiles = null;
                /// start AD query
                using (DirectorySearcher searcher = new DirectorySearcher(new DirectoryEntry(AdHelper.path)))
                {
                    /// configure searcher for group
                    /// https://msdn.microsoft.com/en-us/library/aa746475(v=vs.85).aspx
                    searcher.Filter = string.Format("(&((|(&(objectclass=user)(objectcategory=person))(objectcategory=group)))(cn={0}))", AdHelper.ReplaceSpecialChars(groupDisplayName)); //--> exact search
                    searcher.PropertiesToLoad.AddRange(new[] { AdHelper.member, AdHelper.category, AdHelper.displayName, AdHelper.accountName });
                    searcher.SearchScope = SearchScope.Subtree;

                    SearchResult result = searcher.FindOne();
                    if (result != null) //--> check if there are any results
                    {
                        if (AdHelper.IsGroup((string)result.Properties[AdHelper.category][0])) //--> check if result is a group
                        {
                            ResultPropertyValueCollection propertyValues = result.Properties[AdHelper.member]; //--> get all members for this group : users / groups / both
                            //for (int index = 0; index < propertyValues.Count; ++index) 
                            //{
                                return GetAdProfilesByGroup(AdHelper.GetPropertyCN((string)propertyValues[0])); //--> recursive check each member: user | group, extract displayName first
                            //}
                        }
                        else
                        {
                            //return GetAdProfilesByCN((string)result.Properties[AdHelper.displayName][0], 1);
                            adProfiles = new List<AdProfileDto>(); //--> initialize list 
                            adProfiles.Add(GetAdProfilesByCN((string)result.Properties[AdHelper.displayName][0], 1).FirstOrDefault());
                        }
                    }

                    return adProfiles;
                }
            }

            return null;
        }

我的想法是我从活动目录中获取一些数据,我有 2 组我感兴趣:组和用户。一个组可以有其他组和/或用户。最终结果应该是特定组及其子组(如果有)的用户列表
例如:

GroupeA : user1, user2 => 两者都返回

GroupeB : groupZ, user1 => 结果将是 user1, user3, user4, user5

              |
              -> user 3, user 4, groupT
                                    |
                                     -> user 5

有什么帮助吗? 谢谢。

附:目前我只得到一个结果:在检查具有用户和组(其他用户和子组)的组之后,迭代看起来像:

Groupe1 : GroupeA, GroupeB, GroupeC, User1 , User2 ... UserN

GroupeA:UserA1、UserA2 .. UserAN(仅限)

返回 UserA1 并且函数结束它不会迭代 GroupA 的其余用户,也不会在 GroupeB 级别的调用结束后恢复函数

【问题讨论】:

  • javac#c++.net 怎么了。那里只显示其中一个。
  • 是的,对不起,我想这个概念应该是一样的。
  • 标签应该与问题的内容直接相关,通常有专门针对递归等概念的标签。

标签: c# .net recursion


【解决方案1】:

考虑到您的问题的以下精简版本:

public interface IMember
{
    bool IsGroup { get; }
}

public interface IUser : IMember { }
public interface IGroup: IMember
{
    IEnumerable<IMember> Members { get; }
}

枚举任何给定组的所有用户(包括属于可能的嵌套组的用户)的方法如下:

public static IEnumerable<IMember> GetAllMembers(this IGroup group)
{
    foreach (var member in group.Members)
    {
        if (member.IsGroup)
        {
            var nestedGroup = member as IGroup;
            foreach (var nestedMember in nestedGroup.GetAllMembers())
            {
                yield return nestedMember;
            }                
        }
        else
        {
            yield return member;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多