我有文件夹对象,它们的存储方式使我可以看到哪个文件夹在哪个其他文件夹中。这些对象具有 id
、name
和 parentId
属性。每个文件夹的 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/