控制递归方法深度 - 获取所有子文件夹

时间:2013-03-27 14:57:24

标签: c# recursion .net-3.5

我正在浏览一些股票以获取信息/权限等 我正在使用递归来遍历所有子股票。它工作正常但是,用户应该能够将子共享级别限制为特定数字,这是应用程序中的参数吗?

private static INodeCollection NodesLookUp(string path)
    {
        var shareCollectionNode = new ShareCollection(path);
        // Do somethings

       foreach (var directory in Directory.GetDirectories(shareCollectionNode.FullPath))
        {
            shareCollectionNode.AddNode(NodesLookUp(directory));

        }
        return shareCollectionNode;
    }

这段代码会一直到最低级别,我怎么能在特定级别停止它?例如,只获得所有股票直到2个级别?

感谢。

3 个答案:

答案 0 :(得分:4)

如何传递level变量并在每次递归调用后增加它?这将允许您控制当前递归级别或剩余级别。不要忘记检查是否为空。

private const int maxDepth = 2;

private static INodeCollection NodesLookUp(string path, int level)
{
   if(level >= maxDepth)
        return null;

   var shareCollectionNode = new ShareCollection(path);
   // Do somethings

   foreach (var directory in Directory.GetDirectories(shareCollectionNode.FullPath))
   {
       var nodes = NodesLookUp(directory, level + 1);

       if(nodes != null)
            shareCollectionNode.AddNode(nodes);

   }
   return shareCollectionNode;
}

初始级别可以为零索引,如

NodesLookUp("some path", 0);

答案 1 :(得分:3)

不是使用全局变量来控制级别,而是传递maxLevel并在每次递归调用时递减。

private static INodeCollection NodesLookUp(string path, int maxLevel)
{
    var shareCollectionNode = new ShareCollection(path);
    if (maxLevel > 0)
    {
        foreach (var directory in Directory.GetDirectories(shareCollectionNode.FullPath))
        {
            shareCollectionNode.AddNode(NodesLookup(directory, maxLevel-1));
        }
    }
    return shareCollectionNode;
}

答案 2 :(得分:0)

这个怎么样:

    private static INodeCollection NodesLookUp(string path, Int32 currentLevel, Int32 maxLevel)
    {
        if (currentLevel > maxLevel)
        {
            return null;
        }

        var shareCollectionNode = new ShareCollection(path);
        // Do somethings

        foreach (var directory in Directory.GetDirectories(shareCollectionNode.FullPath))
        {
            INodeCollection foundCollection = NodesLookUp(directory, currentLevel + 1, maxLevel)

            if(foundCollection != null)
            {                
                shareCollectionNode.AddNode();
            }
        }

        return shareCollectionNode;
    }

在这种情况下,您不必担心每次运行方法时都会修改私有字段的状态。而且,只要代码的其余部分是线程安全的,它就是线程安全的。