4

私は Dropbox のデルタ API で遊んでいます。デルタ メソッドを呼び出すと、最後の呼び出し以降に変更されたパスのリストが取得されます。

/photos 
/public 
/photos/sample album 
/photos/sample album/boston city flow.jpg 
/photos/sample album/pensive parakeet.jpg 
/photos/sample album/costa rican frog.jpg 
/getting started.pdf 
/photos/how to use the photos folder.txt 
/public/how to use the public folder.txt 
/ies eai.pptx 
/documents 
/documents/windows phone toolkit in depth 2nd edition.pdf 
/prashant 
/prashant/iphone indexed list.bmml 
/photos/flower.jpg 
/photos/trs 
/photo.jpg 
/hello1 
/hello1/new 

文字列を操作して階層構造 (後述のクラス) を作成するのに苦労しました。

public class DeltaItem
{

    private List<DeltaItem> _items;
    public string Path { get; set; }
    public bool IsDir { get; set; }

    public List<DeltaItem> Items
    {
        get
        {
            return _items ?? (_items = new List<DeltaItem>());
        }
    }
}
4

2 に答える 2

10

これは非常に単純な解析操作です。まず、クラスを次のように定義します。

public class Node
{
    private readonly IDictionary<string, Node> _nodes = 
        new Dictionary<string, Node>();

    public string Path { get; set; }
}

そこから、それは問題です:

  1. パスの解析 (\区切り文字として使用)。
  2. ツリーをたどり、必要に応じて新しいノードを追加します。

上記を単一のメソッドでラップできますAdd

public void AddPath(string path)
{
   char[] charSeparators = new char[] {'\\'};

   // Parse into a sequence of parts.
   string[] parts = path.Split(charSeparators, 
       StringSplitOptions.RemoveEmptyEntries);

   // The current node.  Start with this.
   Node current = this;

   // Iterate through the parts.
   foreach (string part in parts)
   {
       // The child node.
       Node child;

       // Does the part exist in the current node?  If
       // not, then add.
       if (!current._nodes.TryGetValue(part, out child))
       {
           // Add the child.
           child = new Node {
               Path = part
           };

           // Add to the dictionary.
           current._nodes[part] = child;
       }

       // Set the current to the child.
       current = child;
   }
}

これにより、必要な階層が得られます。ディクショナリをトラバースできるようにするディクショナリで動作する操作を公開できますが、これは、作業する一般的な構造を設定する方法です。

no を持たない特異なノードから始めて、上記のリストを繰り返し、上記のリストのすべての項目Pathを呼び出すことに注意してください。AddPath

于 2012-06-05T02:51:36.260 に答える