尝试获取可以拥有无​​限嵌套子对象的所选对象的所有子对象

时间:2013-02-17 18:17:48

标签: c# algorithm recursion

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

所以... 文件夹A. FolderId = 1 ParentFolderId = Null(顶级)

文件夹B. FolderId = 2 ParentFolderId = 1(嵌套在A下)

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

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

我想获取文件夹B的所有子项(或用户选择的任何文件夹),以便我可以删除所有子项,但保留父项(当然,除非选择了顶级文件夹)

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

理想情况下,我希望将它作为我的自定义Folder对象的方法,以便我拥有任何文件夹,我可以说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; }
  }

提前谢谢。

1 个答案:

答案 0 :(得分:3)

这是一个递归方法,可以做你想要的。你可以用你想要得到的孩子的文件夹的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;
}