Возврат рекурсивного результата

#asp.net-mvc #linq

#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"
        }
        ]
    }
  

Комментарии:

1. Как бы вы хотели структурировать вывод? Не могли бы вы добавить пример того, как вы хотите, чтобы «возврат» выглядел?

Ответ №1:

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

 // 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)
}
  

Ответ №2:

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

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

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