Рекурсивно получить список всех детей в дереве (List child)

192
18 сентября 2021, 17:30

Есть объект :

public class mapObject {
    public List<Vector3> ListGeometry;
    public int geometry_type;
    public string key;
    public int layer_number;
    public string name;
    public Sprite icon;
    public string url_texture;
    public string url_prtefab;
    public List<mapObject> childMapObject=null;
}

Как мне с помощью рекурсии получить список всех детей объекта 'childMapObject'.

Я делаю так :

             List<mapObject> temoMObj= new List<mapObject>();
 ...
             List<mapObject> ListChildren(List<mapObject> choiceListMapObj) {
                 if(temoMObj.Count>0) { } else { temoMObj = new List<mapObject>(); } 
                 for(int i=0;i<choiceListMapObj.Count;i++) {
                     for(int j=0;j<choiceListMapObj[i].childMapObject.Count;j++) {
                            temoMObj.Add(choiceListMapObj[i].childMapObject[j]);
                            if(choiceListMapObj[i].childMapObject[j].childMapObject!=null) {
                                ListChildren(choiceListMapObj[i].childMapObject[j].childMapObject);
                         }
                     }
                 }
                 return temoMObj;
             }
 ...

Но это вызывает ошибку:

StackOverflowException: The requested operation caused a stack overflow.

Вложений может быть три и больше(обычно максимум 5 вложений).

Answer 1

Вложений может быть бесконечно много.

Вложений не может быть бесконечно много, в противном случае это вызовет stack overflow.

У Вас в данных получился замкнутый цикл родителей-детей. Поэтому Ваша функция никогда не закончится, а будет уходить все глубже и глубже, пока не поизойдет stack overflow.

Не говоря уже о том, что Вы пропускаете каждый второй уровень объектов.

А вот это

if(temoMObj.Count>0) { } else { temoMObj = new List<mapObject>(); } 

мой мозг отказывается понимать.

Answer 2

Делайте проще и жить будет легче). Элементарная рекурсия

public mapObject GetMap(GameObject parent)
{
  mapObject myMap = CreateMapFromObject(parent);
  Transform trans = myMap.transform;
  List<mapObject> childs = new List<mapObject>();
  for(int i=0; i < trans.ChildCount; i++)
  {
    childs.Add(GetMap(trans.GetChild(i)));
  }
  myMap.childMapObject = childs;
}

Набирал по памяти, на работе Unity нет, так что могут быть ошибки, но смысл такой. CreateMapFromObject- метод который заполняет ваш мэп данными с объекта не просматривая детей.

Answer 3

Помогла ссылка .

Мой код :

public class mapObject
{
    public bool toggle{ get; set; }
    public bool toggle_pref{ get; set; }
    public bool toggle_tex{ get; set; }
    public int iddb{ get; set; }
    public List<Vector3> ListGeometry{ get; set; }
    public int geometry_type{ get; set; }
    public string key{ get; set; }
    public int layer_number{ get; set; }
    public string name{ get; set; }
    public Sprite icon{ get; set; }
    public string url_texture{ get; set; }
    // public string url_prtefab;
    public float mObj_flobjectLandingFrequencyScale{ get; set; }
    public float mObj_brushsize{ get; set; }
    public int id_method{ get; set; }
    public List <mapObject> childMapObject { get; set; }
}

    public List<mapObject> GetAllNodes(mapObject data)
    {
        var result = new List<mapObject>();
        if (data != null && data.childMapObject != null)
        {
            foreach (var item in data.childMapObject)
            {
                result.Add(item);
                result.AddRange(GetAllNodes(item));
            }
        }
        result.Add(data);
        return result;
    }
READ ALSO
Получение информации из файла шрифта

Получение информации из файла шрифта

Всем приветВозник такой вопрос, не могу найти ответов в гугле, может плохо ищу

197
Как реализовать поиск в asp.net mvc который будет учитывать регистр?

Как реализовать поиск в asp.net mvc который будет учитывать регистр?

Есть проект магазина в aspnet mvc, в нем есть поиск по книгам, но проблема в том, что поиск не учитывает регистр

198
VB6.Отправка изображений с помощью WinSock

VB6.Отправка изображений с помощью WinSock

Есть сервер на VB6Этот сервер делает скриншоты экрана с определенной периодичностью и затем отсылает изображение с помощью WinSock клиенту

225
Visual Studio Sql Server не распознает колонку как int

Visual Studio Sql Server не распознает колонку как int

У меня не получается сравнить '>' tPproductPrice из-за ошибки что этот оператор не может сравнить типы string и int

152