Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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#_Algorithm_Recursion - Fatal编程技术网

C# 尝试获取可以具有无限嵌套子对象的选定对象的所有子对象

C# 尝试获取可以具有无限嵌套子对象的选定对象的所有子对象,c#,algorithm,recursion,C#,Algorithm,Recursion,我有一个文件夹层次结构,其中一个文件夹可以有一个父文件夹,深度无限 所以。。。 文件夹A FolderId=1 ParentFolderId=Null顶级 文件夹B FolderId=2 ParentFolderId=1嵌套在 文件夹C FolderId=3 ParentFolderId=2嵌套在B下 文件夹D FolderId=4 ParentFolderId=3嵌套在C下 我希望获得文件夹B或用户选择的任何文件夹的所有子文件夹,以便删除所有子文件夹,但保留父文件夹,当然,除非选择了顶级文件夹

我有一个文件夹层次结构,其中一个文件夹可以有一个父文件夹,深度无限

所以。。。 文件夹A FolderId=1 ParentFolderId=Null顶级

文件夹B FolderId=2 ParentFolderId=1嵌套在

文件夹C FolderId=3 ParentFolderId=2嵌套在B下

文件夹D FolderId=4 ParentFolderId=3嵌套在C下

我希望获得文件夹B或用户选择的任何文件夹的所有子文件夹,以便删除所有子文件夹,但保留父文件夹,当然,除非选择了顶级文件夹

这可能是一些相当简单的递归或foreach循环,但今天早上我正在努力解决它!我使用的是C和EF,所以使用它会非常有用。如果可能的话,我希望结果是一个简单的列表

理想情况下,我希望将它作为自定义文件夹对象的一个方法,这样,我拥有的任何文件夹,我都可以说Folder.Children或类似的东西

文件夹对象:

  public class Folder
  {
    public int Id { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

    public int? ParentId { get; set; }
    public virtual Folder Parent { get; set; }

    public virtual ICollection<File> Files { get; set; }
  }

提前谢谢你。

这里有一个递归方法,它可以做你想做的事情。您使用要获取的子文件夹的Id参数调用此方法,它将检索所有子文件夹和子文件夹中的子文件夹,依此类推

public List<Folder> GetFolderChildsRecursive(Int32 forlderId)
{
    List<Folder> childsOfFolder = context.Folder.Where(e=>e.ParentId == folderId).ToList();
    foreach(Folder child in childsOfFolder)
    {
        List<Folder> childs = GetFoldersRecursive(child.Id);
        childsOfFolder.AddRange(childs);
    }
    return childOfFolder;
}

这里有一个递归方法,它可以实现您想要的功能。您使用要获取的子文件夹的Id参数调用此方法,它将检索所有子文件夹和子文件夹中的子文件夹,依此类推

public List<Folder> GetFolderChildsRecursive(Int32 forlderId)
{
    List<Folder> childsOfFolder = context.Folder.Where(e=>e.ParentId == folderId).ToList();
    foreach(Folder child in childsOfFolder)
    {
        List<Folder> childs = GetFoldersRecursive(child.Id);
        childsOfFolder.AddRange(childs);
    }
    return childOfFolder;
}

你能把你已经尝试过的东西贴出来吗?我没有多少。我试着用一些其他的StackOverflow问题,但是没有成功。你能把你已经尝试过的东西贴出来,这样就可以用它来回答问题了吗?我没有太多。曾尝试使用其他StackOverflow问题,但没有成功。@Josh-Maris适合您+1。您可能希望将其更改为使用迭代器块,使其更加灵活,但总体而言,它将执行您想要的操作?您认为您可以进一步解释一下您的代码吗?@eddy context是EF DbContext实现的一个实例。@Josh-Maris适合您+1。您可能希望将其更改为使用迭代器块,使其更加灵活,但总体而言,它将执行您想要的操作?您认为您可以进一步解释一下您的代码吗?@eddy-context是EF-DbContext实现的一个实例。