Стоит задача брать объект и проходиться по List который содержит ссылки на другие объекты, в которых в свою очередь списки на ещё объекты.
Условно:
Объект 1
List в скрипте на нём:
Объект 2
Объект 3
Берём объект 2 проходится циклом по его листу.
Объект 2
List в скрипте на нём:
Объект 4
Объект 5
Соответственно первый объект 4. Проходится циклом по его листу.
Объект 4
List в скрипте на нём:
Объект 6
Объект 7
И так далее пока не будут обработаны все динамические массивы со ссылками на объекты.
И что-то я ни как не соображу, как все это провернуть?
Рекурсия?
Я бы предложил изучить деревья, но это тема не простая.
А можно задачу конкретезировать, убрав условности типа объект лист и тд. Что именно вы хотите проходить и зачем? Из за этого может кардинально отличаться реализация. По тому, что у вас написано, у вас нет никаких динамических массивов, так как вы говорите про объекты и листы.
Что вы пытаетесь сделать?
Taliesien
Да, думал об этом, делал прикидки, но мало ли есть какой ещё способ, попроще.
Salamandr
Немного не ясно что конкретно с деревьями надо изучить.
FourGen
Система ремонта автомобиля. Я не хочу разбирать его последовательно как это делают обычно, а хочу разбирать его по узлам.
Условно, рама, на нее крепятся рессоры, на них мост, к мосту энергоаккумуляторы, колеса, на колеса шины.
Через иерархию это не решить, так как одна деталь может крепиться сразу к двум, вот надо создавать ссылки что к чему крепится и что на что навешано, чтобы если игрок взял рессору, то с ней снялся мост со всем его оборудованием, а потом собрался.
sledo
> одна деталь может крепиться сразу к двум
Это уже не дерево, а что-то типа ациклического графа. Вплоть до такого
Если это убрать - получится обычное дерево
Некая статья о графах. Подробно не читал, но там есть основная теория, способы задания, добавления/удаления вершин.
https://studref.com/326109/matematika_himiya_fizik/osnovnye_ponya… _opredeleniya
Здесь есть обход дерева:
https://medium.com/@dimko1/%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D… -ed54848c2d47
Развёрнутая рекурсия, типа такого:
public class Class{ List<Class> list; public static void Do(Class firstObj) { List<Class> list = new List<Class>() {firstObj}; int i = 0; while(i < list.Count) { int prevCount = list.Count; for(int j = i; j < prevCount; j++) { var obj = list[j]; // Obrabotka(obj); for(int k = 0; k < obj.list.Count; k++) { if(!list.Contains(obj.list[k])) { list.Add(obj.list[k]); } } } i = prevCount; } }
собираешь список всех объектов, которые надо обработать. На каждой итерации обрабатываешь новые и добавляешь в этот список дочерние объекты необработанных. Проверяешь, чтобы не обрабатывать объекты дважды - иначе можно уйти в бесконечный цикл, если у тебя есть циклические связи
>Sledo
Извиняюсь, более подробно не напишу, так как с телефона.
Вот так более понятно. Но судя по описанию, получается обычное дерево, как привел пример seaman во втором варианте.
Я бы реализовыва бы через массивы.
- набор массивов типов деталей допустим 100 массивов. Очень легко дополнять любой из них.
- узел будет состоять из одномерного массива индексов номера массива деталей (из этих 100)
Как то типа:
1 массив рессор
2 массив фар
3 массив рулей
Узел состоит из индексов номеров массивов.
3, 1, 2
На руль типа mas[3] крепится рессора типа mas[1] на рессору крепится руль типа mas[2]
Узлы тоже можно сделать через подобные вложения.
По крайней мере так доступ будет в 1 действие или максимум 1 массив индексов пройти.
sledo
это типичный обход в глубину
он довольно просто реализуется рекурсивными вызовами на стеке
вопрос только в том точно ли он тебе нужен?