|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
Есть класс, хранящий дерево элементов. Дочерние элементы хранятся в поле списка List<BaseTreeData> Child . Хочу вывести это дерево как "плоский" (линейный) список всех элементов. После разделения класса на два (базовый и наследник) метод GetChildren выдают ошибку про несоответствие типов. Скорее всего все логично, но как это исправить? Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2018, 15:46 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2018, 15:56 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
А как вызывать? А можно сделать этот метод - методом расширения? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2018, 16:27 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2018, 17:53 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
Спасибо. А зачем второй метод GetAll? И как быть, если я класс дерева унаследую (см. код ниже), как привести тип при вызове foreach (var i in TreeEx.GetAll(treeItem, p => p.Children)) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 09:25 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
Roman Mejtes, лучше избегать рекурсии, без крайней необходимости ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 10:30 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
hVosttRoman Mejtes, лучше избегать рекурсии, без крайней необходимости А как тут избежишь? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 12:10 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
hVostt, опасность есть только в переполнении стека, если дерево не супер глубокое и не имеет циклических ссылок, когда потомки ссылаются на предка в качестве свою потомков, проблем не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 12:10 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
Roman Mejtes, все это ужасно медленно ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 12:55 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
ЕвгенийВhVosttRoman Mejtes, лучше избегать рекурсии, без крайней необходимости А как тут избежишь? Создаете очередь\коллекцию вершин которые нужно обойти. Добавляете в неё Root ветку. Запускаете цикл до тех пор пока коллекция вершин не будет пуста. В цикле извлекаете элемент из очереди\коллекции элемент и возвращаете его через yield return, после чего добавляете все его ветки в очередь\коллекцию. Затем повторяете так до тех пор, пока цикл не закончится. Профит. Преимущество этого способа в том, что вы не зависите от размера стека и глубины дерева. Примерно вот так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 13:04 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
Roman Mejtes, лучше использовать коллекцию Stack, а не очередь :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 13:19 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
Исправил. Убрал ненужное заталкивание в очередь/стек всех элементов для извлечения. Только целые коллекции. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 13:26 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
ViPRosвсе это ужасно медленно Потестим на Benchamark.NET :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 13:27 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
hVostt, я делал на коленке в процессе между сборками проекта :) сейчас работы очень много, у тебя косяк в коде 2 раза подряд в одной области видимости определяется переменная item T item и var item, а так всё ок :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 13:47 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
Roman Mejtes, рабочий код так и пишем, всё на коленке шутка ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 14:46 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
hVosttИсправил. Убрал ненужное заталкивание в очередь/стек всех элементов для извлечения. Только целые коллекции. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
А как сюда добавить асинхронную блокировку по значению? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 15:00 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Троллишь чтоли? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 15:15 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
hVosttЕвгенийВ, Троллишь чтоли? Так, для поднятия настроения. :) А вот тут можно обойтись без рекурсии? Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 15:50 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
для этого нужно использовать наследование, а элементы в стеке могут иметь тип Object, а наследники можно получать через условие по типу ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 15:55 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Визитор )) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 19:50 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
hVosttЕвгенийВ, Визитор )) Вот попробуй как нибудь отнаследоваться от ExpressionVisitor , хотя бы тупо переопределить виртуальные методы простым вызовом базового и посмотреть в отладчике стек вызовов. Не пойдет визитор :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2018, 21:34 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Так в этом и смысл. При добавлении класса, его нужно добавить в интерфейс посетителя, что неумолимо приведёт к необходимости написать реализацию. К сожалению, функциональщики этого факта не понимают, по этому со своим аргументом "код в три строки" идут лесом :) Визитор может обойти иерархию и сделать что-нибудь, нахаляву получишь сформированный плоский список. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 07:42 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
hVostt, Визитор обойдет иерархию с использованием взаимной рекурсии. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 09:18 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Визитор тут нужен не для рекурсии, а для извлечения из объекта X, коллекции, если она вообще там есть. Это будет реализация визитора для построения плоского списка из иерархии любой вложенности. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 12:59 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
Визитор и рекурсия, близнецы-братья ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 14:12 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
ЕвгенийВВизитор и рекурсия, близнецы-братья Ниче подобного ) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 15:05 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
hVosttЕвгенийВВизитор и рекурсия, близнецы-братья Ниче подобного ) Если решаем проблему двойной диспетчеризации, то да, нет рекурсии. А если нужно все же обойти дерево, то вот она родненькая! ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 16:48 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
hVosttЕвгенийВ, Так в этом и смысл. При добавлении класса, его нужно добавить в интерфейс посетителя, что неумолимо приведёт к необходимости написать реализацию. К сожалению, функциональщики этого факта не понимают, по этому со своим аргументом "код в три строки" идут лесом :) Визитор может обойти иерархию и сделать что-нибудь, нахаляву получишь сформированный плоский список. Не понимаю, что ты наехал на функциональщиков, но современные функциональные языки легко сводят рекурсию к циклам, если это возможно, сохраняя при этом "код в три строки". Вот пример, это после компиляции превращается в (на c#). Код: 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. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 17:01 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
ЕвгенийВНе понимаю, что ты наехал на функциональщиков, но современные функциональные языки легко сводят рекурсию к циклам, если это возможно, сохраняя при этом "код в три строки". Наезд на функциональщиков здесь не относится к циклам, а к необходимости писать реализации при развитии иерархии классов. Функциональщики просто будут тупо ловить исключения и ошибки отсутствия ошибки обработки новых типов, и никто им тут не поможет. Стандартный посетитель обязывает на уровне компиляции. Да, больше строк кода, но гарантии, сэр. Гарантии. ЕвгенийВВот пример, это после компиляции превращается в (на c#). Ну блин. Компилятор в состоянии разворачивать хвостовые рекурсии и в C#, и даже на C++. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2018, 01:35 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
ЕвгенийВЕсли решаем проблему двойной диспетчеризации, то да, нет рекурсии. А если нужно все же обойти дерево, то вот она родненькая! Да ничего подобного. Реализация посетителя может планировать обход в стуктуру типа стек, это зависит от того, как это реализовано. Отсюда, как я и сказал, по возможности рекурсии надо избегать. Концепция красивая, да. Но нафиг она не нужна, даже если кажется, что ну здесь же не может быть большой глубины. Может. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2018, 01:37 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
ЕвгенийВ...современные функциональные языки легко сводят хвостовую рекурсию к циклам, если это возможно, сохраняя при этом "код в три строки". ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2018, 02:56 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
авторЕсть класс, хранящий дерево элементов. Дочерние элементы хранятся в поле списка List<BaseTreeData> Child. Хочу вывести это дерево как "плоский" (линейный) список всех элементов Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Я деревья по другому рисую Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 10:34 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
Arm79, hVostt Продемонстрируйте пожалуйста оптимизацию хвостовой рекурсии в C#? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 11:44 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Компилируй в x64, получишь свою оптимизацию. Компилируй в x86 (AnyCPU), получишь кукиш :) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 12:25 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
hVostt, Нифига ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 12:51 |
|
Сделать дерево плоским списком
|
|||
---|---|---|---|
#18+
ЕвгенийВhVostt, Нифига Чё нифига? У меня этот код, под x32 падает с StackOverflowException, под x64 отлично работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 13:53 |
|
|
start [/forum/moderation_log.php?user_name=%D0%A1%D0%B2%D1%8F%D1%82%D0%BE%D0%B3%D0%BE%D1%80]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
130ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 1942ms |
total: | 2201ms |
0 / 0 |