Возвращение рекурсивного результата - PullRequest
0 голосов
/ 22 апреля 2019

У меня сейчас есть простой контроллер 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 голосов
/ 23 апреля 2019

Почему бы просто не создать рекурсивную функцию, подобную этой?

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());

Вы также можете сделать функцию локальной функцией, если она нужна только водно место.

0 голосов
/ 22 апреля 2019

Не уверен, что вам действительно нужна рекурсия здесь - приведенного ниже решения (или чего-то подобного) должно быть достаточно

// 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...