1

我目前正在尝试从 C# 将 Flickr 集合和集合树呈现为 HTML。我正在使用 Flickr.NET 库来列出我所有的收藏及其子收藏和集合。

我需要做的是使用嵌套无序列表将此树呈现为 HTML 树,我正在考虑递归解决方案,因为 Collection 可以保存一个或多个集合,还可以保存子集合,这些集合又可以保存集合和集合。

我现在拥有的是所有根集合、它们的子集合和它们的集合的列表。所以我的 Flickr 树看起来像这样:

  • 集合(这个集合在我的列表中作为一个对象本身)

    • 收藏

        • 照片1
        • 照片2
        • 照片1
        • 照片2
    • 收藏

        • 照片1
        • 照片2
        • 照片1
        • 照片2
  • 集合(这个集合在我的列表中作为一个对象本身)

    • 收藏

        • 照片1
        • 照片2
        • 照片1
        • 照片2
    • 收藏

        • 照片1
        • 照片2
        • 照片1
        • 照片2

基本上它可能看起来有一百多种方式,因为编辑器最终会在集合中创建更多集合,在集合中创建更多集合。

因此,对于每个集合和集合,我需要一个新的嵌套无序列表。

我知道这很复杂,但是,如果有一种算法可以将树呈现为 HTML,那就太好了。当谈到递归算法时,我变得有点生疏了:-/

我想我的基本情况是如果当前集合没有任何子集合并且没有任何子集合,那么我可以停止递归方法吗?

非常感谢您对此的任何帮助/提示!

提前非常感谢。

祝一切顺利,

解决方案

我将算法分解为四个步骤:

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 回答