powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Рекурсия по дереву
7 сообщений из 7, страница 1 из 1
Рекурсия по дереву
    #38748790
Фотография vah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите пожалуйста,
есть таблица с полями id, parent_id как рекурсивно определить все дочерние id, относительно конкретной id?

Заранее благодарен.
...
Рейтинг: 0 / 0
Рекурсия по дереву
    #38748806
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) выбрать все дочерние узлы (parent_id=current_id)
2) для каждого выбранного узла вызвать пункт 1)

ЗЫ: Чтобы понять рекурсию, надо понять рекурсию (с)
...
Рейтинг: 0 / 0
Рекурсия по дереву
    #38748829
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vahСкажите пожалуйста,
есть таблица с полями id, parent_id как рекурсивно определить все дочерние id, относительно конкретной id?

Заранее благодарен.
MSSQL- Cte recursion.
Oracle - Connect by.
...
Рейтинг: 0 / 0
Рекурсия по дереву
    #38748897
Фотография vah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделал такое:

авторprivate void seeTree(int id)
{
foreach (DataRow row in data.GetDataTree("ууу").Rows)
{
if ((int)row["id_parant"] == id)
{
expression = expression + row["id"].ToString() + ",";
seeTree((int)row["id"]);
}
}
}

но в этом случае берется только по одному наследнику, а пробежаться надо по всем
...
Рейтинг: 0 / 0
Рекурсия по дереву
    #38749172
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
схематично, и без проверки, на глаз:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public IEnumerable<int> GetChildren(int id = -1)
{
    if (-1 == id)
    {
        // получить список строк, где parent_id заполнен значением для верхнего уровня
    }
    else
    {
        // получить список строк, где parent_id = id
    }
    
    var List<int> result = new List<int>();
    
    foreach (var строка из списка)
    {
        result.AddRange(GetChildren(строка.id))
    }

    return result;
}
...
Рейтинг: 0 / 0
Рекурсия по дереву
    #38749174
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и в качестве отступления. Таблица - это ни фига не дерево. Это таблица.
...
Рейтинг: 0 / 0
Рекурсия по дереву
    #38749419
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
   public class TreeTableItem
    {
        public int Id { get; set; }
        public int ParentId { get; set; }
        public string Description { get; set; }
        public override string ToString()
        {
            var template = "Id-{0};ParentId-{1};Description-{2};";
            return string.Format(template, Id, ParentId, Description);
        }
    }


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 public class TreeHelper
    {
        public static IEnumerable<Tuple<int, int, int, string>> GetChildren(IEnumerable<TreeTableItem> tab, int id, int level)
        {
            foreach (var e in tab.Where(x => x.Id == id))
            {
                yield return Tuple.Create(e.Id, e.ParentId, level, e.Description);                
            }
            foreach (var e in tab.Where(x => x.ParentId == id))
            {
                foreach (var u in GetChildren(tab, e.Id, level + 1))
                {
                    yield return u;
                }
            }
        }
    }


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 var data = new TreeTableItem[] 
            {
                new TreeTableItem(){Id=1,ParentId=-1,Description="Description1"},
                new TreeTableItem(){Id=2,ParentId=1,Description="Description2"},
                new TreeTableItem(){Id=3,ParentId=1,Description="Description3"},
                new TreeTableItem(){Id=4,ParentId=3,Description="Description4"},
                new TreeTableItem(){Id=5,ParentId=2,Description="Description5"},
                new TreeTableItem(){Id=6,ParentId=2,Description="Description6"}
            };
            var res = TreeHelper.GetChildren(data, 2, 1);

            foreach (var d in res)
            {
                Console.WriteLine(d + "level-" + d.Item3);
            }
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Рекурсия по дереву
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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