powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Раскрутка дерева
9 сообщений из 9, страница 1 из 1
Раскрутка дерева
    #32628758
viper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача не имеет прямого отношения ни к C#, ни к NET. Но все же нужно ее решить. Итак, есть табличка с двумя полями ID, OwnderID в ID содержится ID :) (уникальный), в OwnerID содержится ID владельца этого елемента (NULL если нет). Вот сие чудо нужно превратить в XML файл. Меня не интересуют подробности технической реализации (подключение к базе, создание XML и т.д., эт слава богу сам умею делать), меня интересует сам алгоритм. Есть пару идей, но чувствую что они не самые удачные, посему и прошу помощи. Все усложняется тем что кол-во данных от 100 тыс до 500 тыс записей, и использование Hashtable и прочих не желательно (слишком большие затраты ресурсов и времени на boxing/unboxing), про genetics еще пока не думал. Короче мож кто-то сталкивался с подобной задачей, или может где-то можно почитать (и плз. не надо ссылок на инфу о деревьях и т.д. у меня том Кнута на столе лежит).
_________________________________________________
Легче написать не правильную программу чем понять правильную (С) Alan Perlis
...
Рейтинг: 0 / 0
Раскрутка дерева
    #32628793
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял. Алгоритм чего? Получения XML? Это можно сделать селектом For XML.

Magnus
...
Рейтинг: 0 / 0
Раскрутка дерева
    #32628870
viper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема состоит в раскрутке дерева... что б построить XML мне нужно знать корневой елемент, а потом постепенно подсоединять к нему дочерные елементы.
_________________________________________________
Легче написать не правильную программу чем понять правильную (С) Alan Perlis
...
Рейтинг: 0 / 0
Раскрутка дерева
    #32628908
avg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть таблица с селф связью (дерево без органичения вложенности), и, надеюсь, она в MSSQL (ну или хотя бы в Oracle :) ), то есть ,имхо, два пути его (дерева) раскрутки:
1. на сервере, путем неявной рекурсии, если не использовать вспомагательных таблиц. Кстати не самый плохой метод. Я спокойно раскручивал дерево в 60 тыс. элементов с уровнем вложения до 10. Время нараскрутку 3-4 секунды на не самой крутой тачке, и запрос написан в лоб (до оптимизации руки не дошли пока)
2. явная рекурсия на клиенте. Здесь все и проще и сложнее. Алгоритм обхода достаточно прост - от корня к листьям - запросы по требованию (on demand). Приблизительно как при заполнении treeview на обработчике события Expand - тут (или в ADO.NET форуме это уже обсуждалось). Ресурсов уходит мало, если конечно в ветках не по миллиону элементов! Но скорость сильно зависит от мощности клиента.
...
Рейтинг: 0 / 0
Раскрутка дерева
    #32628928
viper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый не подходит так как я в жестких рамках универсальности :( Все приходиться делать на клиенте (причем я не знаю, ни базу, ни структуру таблицы, ни названия полей... все идет на вход).
Согласен, воторой варинт работает. Насколько я нпонимаю по ходу рекурсии нужно вычищать прочтенные данные дабы не париться с ними каждый раз...
_________________________________________________
Легче написать не правильную программу чем понять правильную (С) Alan Perlis
...
Рейтинг: 0 / 0
Раскрутка дерева
    #32628965
avg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНасколько я нпонимаю по ходу рекурсии нужно вычищать прочтенные данные дабы не париться с ними каждый раз

Дык они сами очистятся, как только reader (recordset, dataset и т.д...) заполнишь данными от следующего узла. Сборка мусора, мать его... (мусор :) )
Проблема с ресурсами может возникнуть, если вложенность оооочень большая :(
...
Рейтинг: 0 / 0
Раскрутка дерева
    #32629006
viper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С Reader-ом я чет слабо представлю процесс... предположим мне вернулся DataReader reader с полями "ID", "OwnerID"

while(reader.Read())
{
....
}
Каким образом я смогу родить рекурсию если мне доступна только текущая запись? Ведь не извесно будет ли следующая запись потомком текущей, а может она будет потомком потомка текущей, или вообще отдельной ветвью...
_________________________________________________
Легче написать не правильную программу чем понять правильную (С) Alan Perlis
...
Рейтинг: 0 / 0
Раскрутка дерева
    #32629116
avg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпредположим мне вернулся DataReader reader с полями "ID", "OwnerID"


Нет, вернулся reader с полями "ID", "OwnerID" и "HasChildren"

где-то так для MSSQL:

Код: plaintext
1.
2.
3.
4.
5.
Select ID, ...
         OwnerID
         HasChildren = Cast(case when Exists(Select T.ID from Table1 AS T WHERE  T.OwnerID = table1.ID) then  1  else  0  end as bit)
From table1
Where ...

Ну а дальше, я думаю понятно...
...
Рейтинг: 0 / 0
Раскрутка дерева
    #32629120
avg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. после OwnerID - запятая.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Раскрутка дерева
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]