Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 递归查找函数C的性能#_C#_Recursion - Fatal编程技术网

C# 递归查找函数C的性能#

C# 递归查找函数C的性能#,c#,recursion,C#,Recursion,我们有以下递归函数,用于查找组对象的以下属性中列出的成员对象。我们使用组列表进行组中的递归检查 此功能大约有30k用户和40k组,运行大约需要20分钟,我们希望加快运行速度。有什么办法能更有效地做到这一点吗 foreach (ad_group_source group in group_source) { List<ad_user_source> list = FindMembers(group, group_source, user_source); } public s

我们有以下递归函数,用于查找组对象的以下属性中列出的成员对象。我们使用组列表进行组中的递归检查

此功能大约有30k用户和40k组,运行大约需要20分钟,我们希望加快运行速度。有什么办法能更有效地做到这一点吗

foreach (ad_group_source group in group_source)
{
    List<ad_user_source> list = FindMembers(group, group_source, user_source);
}

public static List<ad_user_source> FindMembers(ad_group_source group, HashSet<ad_group_source> group_source, HashSet<ad_user_source> user_source)
{
    List<String> members = group.Members.Split(';').ToList();
    if (members.Equals(""))
    {
        return new List<ad_user_source>();
    }
    List<ad_user_source> members2 = new List<ad_user_source>();
    foreach (String member in members)
    {
        if (!member.Equals(""))
        {
            Boolean isUser = false;
            ad_user_source gebruiker = user_source.FirstOrDefault(u => u.DistinguishedName == member);
            if (gebruiker != null)
            {
                members2.Add(gebruiker);
                isUser = true;
            }
            if (!isUser)
            {
                ad_group_source group2 = group_source.FirstOrDefault(g => g.CN == member.Substring(3));
                if (group2 != null)
                {
                    List<ad_user_source> l = FindMembers(group2, group_source, user_source);
                    members2.AddRange(l);
                }
            }
         }

     }
     List<ad_user_source> members3 = members2.Distinct().ToList();
     return members3;
 }
foreach(组源中的ad组源组)
{
列表=FindMembers(组、组\源、用户\源);
}
公共静态列表FindMembers(ad_组_源组、HashSet组_源、HashSet用户_源)
{
List members=group.members.Split(“;”).ToList();
if(成员数等于(“”)
{
返回新列表();
}
列表成员2=新列表();
foreach(成员中的字符串成员)
{
如果(!member.Equals(“”)
{
布尔值isUser=false;
ad_user_source gebruiker=user_source.FirstOrDefault(u=>u.discrimitedName==member);
if(gebruiker!=null)
{
成员2.添加(gebruiker);
isUser=true;
}
如果(!isUser)
{
ad_group_source group2=group_source.FirstOrDefault(g=>g.CN==member.Substring(3));
if(group2!=null)
{
列表l=FindMembers(组2、组源、用户源);
成员2.添加范围(l);
}
}
}
}
List members3=members2.Distinct().ToList();
返回成员3;
}

问题在于,您的代码一直在使用哈希集,就好像它们是列表一样。这是非常低效的


要解决此问题,请构建一个由
DifferentizedName
组织的
词典
,以及由
g.CN
组织的
词典
。不要将
CN
长度超过三个字符的组放入,以防原始组中有任何字符。

问题在于,您的代码一直在使用哈希集,就好像它们是列表一样。这是非常低效的


要解决此问题,请构建一个由
DifferentizedName
组织的
词典
,以及由
g.CN
组织的
词典
。不要将组中的
CN
长度超过三个字符,以防原始组中有任何字符。

在这里,“让事情变得更快”并不是最大的问题,因为它可能只适用于您的代码,对其他人没有帮助。如果您想查看整个代码并提供示例数据,这可能没问题,但在询问之前请先阅读他们的帮助中心。是否值得缓存此操作?@MikeMcCaughan:为什么它不能帮助任何人?我使用的是一个没有执行的递归函数?我发现这段代码有很多错误。因为改进代码的细节不一定与改进其他代码所需的更改相同。“让事情更快”并不是这里最大的问题,因为它可能只适用于您的代码,而对其他代码没有帮助。如果您想查看整个代码并提供示例数据,这可能没问题,但在询问之前请先阅读他们的帮助中心。是否值得缓存此操作?@MikeMcCaughan:为什么它不能帮助任何人?我使用的递归函数没有执行?我发现这段代码有很多错误。因为改进代码的细节不一定与改进其他代码所需的更改相同。感谢您提供解决此问题的指导。我会尝试一下,如果可行的话,我会把你的答案标记为解决方案。字典的使用大大提高了性能。谢谢谢谢你的指导来解决这个问题。我会尝试一下,如果可行的话,我会把你的答案标记为解决方案。字典的使用大大提高了性能。谢谢