c# - 从给定的文件路径字符串中获取最后一个文件夹的 ID 作为正在创建的新文件夹的父 ID

标签 c# asp.net-mvc algorithm linq

我有文件夹对象,它们的存储方式使我可以看到哪个文件夹在哪个其他文件夹中。这些对象具有 idnameparentId 属性。每个文件夹的 parentId 是另一个文件夹的 id。根文件夹的父 ID 为空。

我有一个允许创建新文件夹的表单。该表单采用 name(字符串)和 parent(字符串)输入。名称可以是任何名称,但父级必须采用现有文件夹的格式:"Documents|Books|Fiction" 等。如果还没有文件夹,则创建初始 Documents 文件夹,父文件夹可以为空。

我正在努力寻找算法,以确保在给定父文件路径的情况下将新文件夹映射到正确的文件夹中。例如,如果文件夹结构如下所示:

文档|假期

文件|书籍|假期

文件|工作|书籍|假期

假设我正在创建一个新文件夹,名称为 name "My Day in Paris"parent "Documents| Books|Holidays"CreateFolder 的 Controller 方法中,在将新的 Folder 对象保存到数据库之前,我需要将此 Folder 对象父文件夹的 ParentId。在我们的例子中,父级是 Holidays 文件夹,其路径为 "Documents|Books|Holidays"

例如,我可以查询数据库(伪代码): db.Folders.where(x => x.Name == "Holidays").Select(y => y.Id).single(); 但这不会让我从中找到正确的文件夹设置正确 ParentId 的文件路径。

这样怎么获取parent Id呢?我试着四处搜索了很长时间,并试图制定出一种算法,但没有成功。

更新我自己的尝试。它达到要返回的正确值,但它没有返回这个值,而是继续返回到先前暂停的递归循环。如何在不返回的情况下中断输出值?

public int GetIdFromPath(string path)
        {
            int _parentId = 0;
            var folderStructure = GetFolderStructure();

            if (path != null)
            {
                _parentId = recursiveFunction(path, folderStructure);
                return _parentId;
            }

            return _parentId;
        }

        private int recursiveFunction(string path, List<Folder> folders)
        {
            var splitPath = path.Split('|');
            var _parentId = 0;
            foreach (var item in splitPath)
            {
                try
                {
                    foreach (var folder in folders)
                    {
                        if (folder.Name == item)
                        {
                            splitPath = splitPath.Where(x => x != item).ToArray();
                            _parentId = folder.Id;

                            if (splitPath.Count() > 0)
                            {
                                var newPath = string.Join("|", splitPath);
                                recursiveFunction(newPath, folder.FolderBookmarks.OfType<Folder>().ToList());
                            }

                            return _parentId;
                        }
                    }
                }
                catch (Exception e)
                {
                    return _parentId;
                }
            }

            return _parentId;
        }

        public List<Folder> GetFolders()
        {
            var folders = db.Bookmarks.OfType<Folder>().ToList();
            return folders;
        }

        public List<Folder> GetFolderStructure()
        {
            var folders = GetFolders();

            foreach (var folder in folders)
            {
                var bookmarks = db.Bookmarks.Where(x => x.ParentId == folder.Id).ToList();
                folder.FolderBookmarks = bookmarks;
            }

            return folders;
        }

最佳答案

必须像这样一步步找到每一个父节点,还要处理异常:

int? _parentId = null;
foreach (var item in path.Split('|'))
{
    var folder = db.Folders
                    .where(x => x.Name == item&&x.ParentId = _parentId)
                    .Select(y => y.Id)
                    .Single();
    _parentId = folder.Id;
}
return _parentId;

关于c# - 从给定的文件路径字符串中获取最后一个文件夹的 ID 作为正在创建的新文件夹的父 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47849703/

相关文章:

c# - 如何在 Linux 上使用 Mono 将 Perl 解释器嵌入到我的 C# 程序中?

algorithm - 如何在 Lua 中实现 brushfire 算法?

sql-server - 使用 int 作为主键是否存在安全风险?

jquery - ASP.NET MVC - DropDownList 更改时刷新部分 View

java - Java 中 TSP 的分支定界实现

python - Python 的 cmp_to_key 函数是如何工作的?

c# - 使用托管 WiFi (NativeWiFi API) 的问题

c# - Singleton 中具有 PerWebRequest 生活方式的对象

c# - 如何从文件字节开始在内存中创建一个 zip 文件?

asp.net-mvc - 如何使用可空类型的强类型 HTML 助手?