どのフォルダが他のどのフォルダにあるかを確認できる方法で保存されたフォルダオブジェクトがあります。これらのオブジェクトは、id
,name
およびparentId
の属性を持ちます。各フォルダのparentId
は別のフォルダのid
です。ルートフォルダの親Idがnullです。作成中の新しいフォルダの親IDとして機能するために、指定されたファイルパス文字列から最後のフォルダのIDを取得します。
新しいフォルダを作成できるフォームがあります。フォームはname
(文字列)とparent
(文字列)の入力を受け取ります。名前は何でもかまいませんが、親フォルダは既存のフォルダの形式("Documents|Books|Fiction"
など)でなければなりません。すでにフォルダが存在しない場合は、最初のDocuments
フォルダを作成するために親フォルダを空にすることができます。
親のファイルパスを指定して、新しいフォルダが正しいフォルダに確実にマップされるように、アルゴリズムを見つけるのに苦労しています。例えば、フォルダ構造は次のような場合:
Documents|Holidays
Documents|Books|Holidays
Documents|Jobs|Books|Holidays
そして、私はコントローラでname
"My Day in Paris"
とparent
"Documents|Books|Holidays"
で新しいフォルダを作成していますことを言うことができます新しいFolder
オブジェクトをデータベースに保存する前に、CreateFolder
のメソッドを使用するには、これを与える必要がありますFolder
ob親フォルダのParentId
を開きます。私たちの場合、親はHolidays
のフォルダで、パスは"Documents|Books|Holidays"
です。
たとえば、私はデータベース(擬似コード)に問い合わせることができます: db.Folders.where(x => x.Name == "Holidays").Select(y => y.Id).single();
しかし、これは正しいParentIdを設定するためにファイルパスから正しいフォルダを取得できません。
このようにして親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;
}
'Parent' /' Children'プロパティを持つツリービュー構造のようなものですか? – Aybe
こんにちは、私は知っていますが、私はparent_Id参照のみを使用してこれを完了しようとしています。ありがとう。 – naz786
再帰アルゴリズムを作成する必要があります。おそらく、GetFiles()メソッドを使用し、すべてのサブフォルダを取得するのではなく、一度に1つのディレクトリを取得する方がよいでしょう。コードは非常に簡単です。前に何度も書いたことがある。 – jdweng