3

情報/権限を取得するためにいくつかの共有を移動しています..など、すべてのサブ共有を移動するために再帰を使用しています。それは正常に動作しますが、ユーザーはサブ共有レベルをアプリケーションのパラメーターである特定の数に制限できるはずですか?

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 レベルまでのすべてのシェアを取得しますか?

ありがとう。

4

3 に答える 3

5

変数を渡しlevelて、再帰呼び出しの各レベルの後にそれを増やすのはどうですか? これにより、現在の再帰レベルや残りのレベル数を制御できます。null をチェックすることを忘れないでください。

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);
于 2013-03-27T14:59:24.810 に答える
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;
}
于 2013-03-27T15:16:18.247 に答える
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;
    }

この場合、メソッドが実行されるたびにプライベート フィールドの状態が変更されることを心配する必要はありません。そして、残りのコードがスレッドセーフである限り、スレッドセーフになります。

于 2013-03-27T15:14:15.377 に答える