将元素添加到列表的递归方法

时间:2014-09-11 10:11:37

标签: c# list recursion

我想获取文件夹的所有子目录列表,包括嵌套的子目录 因此,我希望有一个list<Folder> myList将由递归方法填充。

 void myMethod(?)  
 {
   list<Folder> listFolders = ...  ;
   foreach (Folder curFolder in listFolders)
      {
        myList.add(curFolder);
      }
 }

有可能吗?

3 个答案:

答案 0 :(得分:5)

声明一个像这样的函数

List<Folder> ListFolders(Folder initialFolder)
{
    var folders = new List<Folder>();
    folder.Add(initialFolder);
    foreach (var f in initialFolder.GetSubFolders())
    {
        folders.AddRange(ListFolders(f));
    }
    return folders;
}

Folder类留给你作为练习,它必须包含当前文件夹的名称,以及获取其子文件夹的方法(提示:查看System.IO.Directory类)

答案 1 :(得分:1)

以下是一个从IEnumerable递归中选择的扩展方法:

    public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> recursiveSelector)
        {
            foreach (var i in source)
            {
                yield return i;

                var directChildren = recursiveSelector(i);
                var allChildren = SelectRecursive(directChildren, recursiveSelector);

                foreach (var c in allChildren)
                {
                    yield return c;
                }
            }
        }

您可以使用它来创建一个&#34; flat&#34;可以从每个层次结构中枚举出来。假设Folder类有一个返回其直接子节点的属性:如下所示:

public class Folder 
{
    public IEnumerable<Folder> Children {get;}
}

您将能够获得包含以下行的子文件夹的平面列表:

var flatList = folder.SelectRecursive(f => f.Children).ToList();

希望这就是你的意思。

答案 2 :(得分:0)

    static void Main(string[] args)
    {
            List<string> dirs = new List<string>();
            addDirectoryToList(@"C:\exampledir\", dirs);
    }

    void addDirectoryToList(string dir, List<string> list)
    {
        DirectoryInfo dirInfo = new DirectoryInfo(dir);
        foreach (DirectoryInfo subdir in dirInfo.GetDirectories())
        {
            addDirectoryToList(subdir.FullName, list);
        }
    }

或没有递归:

    void addDirectoryToList(string dir, List<string> list)
    {
        DirectoryInfo dirInfo = new DirectoryInfo(dir);
        list.Add(dir);
        foreach (DirectoryInfo subdir in dirInfo.GetDirectories("*", SearchOption.AllDirectories))
        {
            list.Add(subdir.FullName);
        }
    }