Есть объект :
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 вложений).
Вложений может быть бесконечно много.
Вложений не может быть бесконечно много, в противном случае это вызовет stack overflow.
У Вас в данных получился замкнутый цикл родителей-детей. Поэтому Ваша функция никогда не закончится, а будет уходить все глубже и глубже, пока не поизойдет stack overflow.
Не говоря уже о том, что Вы пропускаете каждый второй уровень объектов.
А вот это
if(temoMObj.Count>0) { } else { temoMObj = new List<mapObject>(); }
мой мозг отказывается понимать.
Делайте проще и жить будет легче). Элементарная рекурсия
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
- метод который заполняет ваш мэп данными с объекта не просматривая детей.
Помогла ссылка .
Мой код :
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;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Всем приветВозник такой вопрос, не могу найти ответов в гугле, может плохо ищу
Есть проект магазина в aspnet mvc, в нем есть поиск по книгам, но проблема в том, что поиск не учитывает регистр
Есть сервер на VB6Этот сервер делает скриншоты экрана с определенной периодичностью и затем отсылает изображение с помощью WinSock клиенту
У меня не получается сравнить '>' tPproductPrice из-за ошибки что этот оператор не может сравнить типы string и int