返回递归结果

时间:2019-04-22 16:14:53

标签: asp.net-mvc linq

我目前在简单的MVC Api控制器中具有此功能:

var rootFolder = Umbraco.TypedMedia(200);

                return rootFolder.Children().Select(s => new MediaItem
                {
                    Name = s.Name,
                    Children = s.Children.Select(e => new MediaItem
                    {
                        Name = e.Name
                    })
                 });

它有效,但仅返回1级和2级。

我尝试使用

return rootFolder.Descendants(),它返回所有级别的所有结果-但“变平”了,所以我看不到输出中的结构。 输出在一个简单的应用程序中使用,可导航树结构。

关于我如何使其递归的任何想法?

使用后代,输出将像这样返回

[
    {
        "Name":"dok1"
    },
    {
        "Name":"dok2"
    },
    {
        "Name":"dok21"
    }
]

但是应该是

[
    {
        "Name":"dok1"
    },
    {
        "Name":"dok2"
        "Children": [
        {
            "Name":"dok21"
        }
        ]
    }

2 个答案:

答案 0 :(得分:0)

不确定此处是否真的需要递归-以下解决方案(或类似方法)应足够

// Dictionary between level/depth(int) and the files on that level/depth
var fileDictionary = new Dictionary<int, List<MediaItem>>();
var children = rootFolder.Children();
var depth = 1;
while (children.Any())
{
    var tempList = new List<MediaItem>();
    children.ForEach(child => {
        tempList.Add(child);
    });
    fileDictionary.Add(depth, tempList);
    children = children.Children();
    depth++;
}

然后,您可以执行以下操作:

foreach (var key in fileDictionary.Keys)
{
   // Access the key by key.Key (key would be "depth")
   // Access the values by fileDictionary[key] (values would be list of MediaItem)
}

答案 1 :(得分:0)

为什么不仅仅创建像这样的递归函数?

IEnumerable<MediaItem> ConvertToMediaItems(IEnumerable<IPublishedContent> items)
{
    return items?.Select(i => new MediaItem
    {
        Name = i.Name,
        Children = ConvertToMediaItems(i.Children)
    }) ?? Enumerable.Empty<MediaItem>();
}

那么用法是

var rootFolder = Umbraco.TypedMedia(200);

return ConvertToMediaItems(rootFolder.Children());

如果仅在一个地方需要该功能,也可以将该功能设置为局部功能。