|
Рекурсивно перессоздать дерево из линейно построенного List<T>
|
|||
---|---|---|---|
#18+
Добрый день. Есть тип Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
И есть список объектов данного типа: Код: c# 1.
Список categorylist содержит объекты, у каждого из которых поле ChildCategories является NULL. Ну это пока null. Требуется так перестроить этот список, что бы все дочерние категории переместить в их родительские, при этом глубина вложенности может быть сколь угодно глубокой. Накрапал рекурсивный метод: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
И работает ну почти так, как ожидается. Да, все объекты подкатегорий были перенесены в объекты верхних категорий, что и требуется. Но также эти объекты эти объекты остались на своих местах. Точнее, ссылки остались (тип то ссылочный). Если изначально categorylist содержал 10 элементов категорий, то после перетасовки, к примеру, должен был содержать только 4 элемента (а внутри которых должны содержаться остальные 6, разбросанные в соответствии). Если расскомментить строки //categorylist.Remove(category); //i--; то в определенный момент цикл накрывается. Загвоздка в том, что как правильно удалять перемещаемые элементы из одного места в списке, в другой объект. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2015, 18:48 |
|
Рекурсивно перессоздать дерево из линейно построенного List<T>
|
|||
---|---|---|---|
#18+
zalsily, Понятно, что будут проблемы. Как вариант - собрать все категории для удаления в новую коллекцию, а послед выхода из цикла добавления к верхним категориям пройтись по этой 'собранной' коллекции и поудалять в нижних категориях. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2015, 19:14 |
|
Рекурсивно перессоздать дерево из линейно построенного List<T>
|
|||
---|---|---|---|
#18+
Axeleron, уже сделал так. Но, как всегда, обнаружилась другая проблема. Почему то на уровне вложенности 3 и глубже по два раза подподкатегории добавлены. Наверное надо перед добавление проверку делать на присутствие такого объекта (где-то по несколько раз, видимо, проход получается по одному и тому же номеру спсика, что и тянет несколько раз один и тот же элемент). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2015, 19:23 |
|
Рекурсивно перессоздать дерево из линейно построенного List<T>
|
|||
---|---|---|---|
#18+
zalsilyНаверное надо перед добавление проверку делать на присутствие такого объекта (где-то по несколько раз, видимо, проход получается по одному и тому же номеру спсика, что и тянет несколько раз один и тот же элемент). Это по-любому хорошая идея :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2015, 19:25 |
|
Рекурсивно перессоздать дерево из линейно построенного List<T>
|
|||
---|---|---|---|
#18+
zalsily, можно обойтись и без рекурсии Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2015, 07:27 |
|
|
start [/forum/topic.php?fid=20&tid=1401239]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
others: | 316ms |
total: | 445ms |
0 / 0 |