【问题标题】:Trying to get all children of a selected object that can have unlimited nested children objects尝试获取可以具有无限嵌套子对象的选定对象的所有子对象
【发布时间】:2013-02-02 04:19:31
【问题描述】:

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

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

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

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

文件夹 D 文件夹 ID = 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; }
  }

提前谢谢你。

【问题讨论】:

  • 您能否发布您迄今为止尝试过的内容,以便从中构建答案?
  • 我没有多少。曾尝试使用其他一些 StackOverflow 问题,但没有成功。

标签: c# algorithm recursion


【解决方案1】:

这是一种递归方法,可以满足您的需求。您使用要获取的子文件夹的 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;
}

【讨论】:

  • @Josh - Maris 适合您 +1。您可能希望更改它以使用迭代器块以更灵活,但总体而言它会做您想要的。
  • 很抱歉打扰您,但上下文是什么?你认为你可以多解释一下你的代码吗?
  • @eddy 上下文是实现 EF DbContext 的一个实例。
猜你喜欢
  • 1970-01-01
  • 2020-04-13
  • 2021-07-16
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多