2017-12-16 16 views
0

どのフォルダが他のどのフォルダにあるかを確認できる方法で保存されたフォルダオブジェクトがあります。これらのオブジェクトは、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; 
     } 
+0

'Parent' /' Children'プロパティを持つツリービュー構造のようなものですか? – Aybe

+0

こんにちは、私は知っていますが、私はparent_Id参照のみを使用してこれを完了しようとしています。ありがとう。 – naz786

+0

再帰アルゴリズムを作成する必要があります。おそらく、GetFiles()メソッドを使用し、すべてのサブフォルダを取得するのではなく、一度に1つのディレクトリを取得する方がよいでしょう。コードは非常に簡単です。前に何度も書いたことがある。 – jdweng

答えて

0

私は解決策が出ています。変数foldersはフォルダオブジェクトのリストです。 (注:フォルダには多数のフォルダがあります)。次のコードは、パス名と一致するフォルダ名のフォルダIDとして親IDを設定します。フォルダリストは、そのフォルダのフォルダの内部リストに設定されます。これによりフォルダ内を見ることができます。 (この文脈では、重複するフォルダ名は許可しないことに注意してください)。ありがとうReza、あなたのコメントは助けた!

public int GetParentIdFromPath(string path) 
    { 
     int _parentId = 0; 

     if (path != null) 
     { 
      var folders = GetFolderStructure(); 
      var splitPath = path.Split('|'); 

      foreach (var item in splitPath) 
      { 
       _parentId = folders.Where(x => x.Name == item).SingleOrDefault().Id; 
       folders = folders.Where(x => x.Name == item).SingleOrDefault().FolderBookmarks.OfType<Folder>().ToList(); 
      } 

      return _parentId; 
     } 

     return _parentId; 
    } 
+0

誰も私がコーディングアルゴリズムでより堪能で高速になる方法をお勧めしますか?これは、ここで受け取った指導から考えて1日と5時間を開発するために私にかかった。私の友人は私よりもこの問題を解決するのが速かった。 – naz786

1

次のような手順により、各親ステップを見つけても、例外を処理する必要があります。

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; 
+0

私は再帰的な近似を持つaswerを書いていましたが、私はこれが好きでした – mnieto

+0

ありがとうReza、私は理解しますが、これは既存のフォルダと同じ名前のフォルダには適していません。たとえば、「Documents | University | Pictures」と「Documents | University | Pictures」があり、新しいフォルダのファイルパスが「Documents | University | Pictures」の場合、コードには'' Picture ''フォルダが2つあるので、idを使用します。このコードでは例外がスローされます。私は名前のフォルダのリストを作成することで対処しようとしますが、正しい "Pictures"フォルダのIDを取得する方法はわかりません。 – naz786

+1

@ naz786-あなたはコードを理解できませんでした。ツリーを上から下へとトレースするので、すべての検索が親の子で実行されました。あなたの例では、私たちが親の子供( '大学'子どもたち)。 –

関連する問題