1

現在、Flickr コレクションとセットのツリーを C# から HTML としてレンダリングしようとしています。Flickr.NET ライブラリを使用して、子コレクションとセットを含むすべてのコレクションのリストを表示しています。

私がする必要があるのは、ネストされた順序付けられていないリストを使用して、このツリーを HTML ツリーとしてレンダリングすることです。コレクションは 1 つ以上のセットを保持でき、セットとコレクションを保持できる子コレクションも保持できるため、再帰的なソリューションを考えています。

私が今持っているのは、すべてのルート コレクション、その子コレクション、およびそのセットのリストです。つまり、私の Flickr ツリーは次のようになります。

  • コレクション (このコレクションは、オブジェクト自体としてリストに含まれています)

    • コレクション

      • 設定
        • 写真1
        • 写真2
      • 設定
        • 写真1
        • 写真2
    • コレクション

      • 設定
        • 写真1
        • 写真2
      • 設定
        • 写真1
        • 写真2
  • コレクション (このコレクションは、オブジェクト自体としてリストに含まれています)

    • コレクション

      • 設定
        • 写真1
        • 写真2
      • 設定
        • 写真1
        • 写真2
    • コレクション

      • 設定
        • 写真1
        • 写真2
      • 設定
        • 写真1
        • 写真2

基本的に、編集者は最終的にコレクション内にさらに多くのコレクションを作成し、セット内にセットを作成するため、100 通り以上の方法に見える可能性があります。

したがって、コレクションとセットごとに、新しいネストされた順序なしリストが必要です。

これが非常に複雑であることは承知していますが、それでも、ツリーを HTML としてレンダリングするアルゴリズムがあれば素晴らしいことです。再帰アルゴリズムに関しては、ちょっとさびしすぎました:-/

ここでの私のベースケースは、現在のコレクションに子コレクションがなく、何もない場合、再帰メソッドを停止できると思いますか?

これに関するヘルプ/ヒントは大歓迎です!

よろしくお願いします。

ではごきげんよう、

ボー

解決

アルゴリズムを 4 つのステップに分けました。

private void LoadFlickrTreeRecursive()
    {
        foreach (var collection in allCollections)
        {
            flickrTreeMarkup.Append("<ul class='collection'>");
            flickrTreeMarkup.Append("<li>" + collection.Title + "</li>");
            if (collection.Sets.Count > 0)
                RenderFlickPhotoSet(collection.Sets);

            if (collection.Collections.Count > 0)                
                RenderFlickrCollectionRecursive(collection.Collections);                    

            flickrTreeMarkup.Append("</ul>");
        }
    }

    private void RenderFlickPhotoSet(System.Collections.ObjectModel.Collection<CollectionSet> sets)
    {
        foreach (var set in sets)
        {
            flickrTreeMarkup.Append("<ul class='set'>");
            flickrTreeMarkup.Append("<li>" + set.Title + "</li>");
            var photos = flickr.PhotosetsGetPhotos(set.SetId);
            if (photos.Count > 0)
            {
                flickrTreeMarkup.Append("<ul class='photos'>");
                foreach (var photo in photos)
                {
                    flickrTreeMarkup.Append("<li>" + photo.Title + "</li>");
                }
                flickrTreeMarkup.Append("</ul>");
            }
            flickrTreeMarkup.Append("</ul>");                 
        }
    }

    private void RenderFlickrCollectionRecursive(System.Collections.ObjectModel.Collection<Collection> collections)
    {
        foreach (var collection in collections)
        {
            flickrTreeMarkup.Append("<ul class='collection'>");
            flickrTreeMarkup.Append("<li>" + collection.Title + "</li>");
            RenderFlickPhotoSet(collection.Sets);
            if (collection.Collections.Count > 0)
            {                    
                RenderFlickrCollectionRecursive(collection.Collections);                    
            }
            flickrTreeMarkup.Append("</ul>");                
        }            
    }

魅力のように機能します:-)

しかし、これよりも良い方法を知っている方がいましたら教えてください。ありがとう!

4

1 に答える 1

0

このアルゴリズムは、TreeView コントロールで動作する必要があります。

function rec(Collection c, TreeNode n)
{
   TreeNode me = new TreeNode();
   n.ChildNodes.Add(me);
   for each collection v in c:
       rec(v, me)
   for each set s in c:
       AddSet(s, me)
}
于 2012-08-30T10:23:18.140 に答える