powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Обход дерева LINQом
20 сообщений из 20, страница 1 из 1
Обход дерева LINQом
    #37971195
asd555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.
Есть класс
Код: c#
1.
2.
3.
class MyClass
int id,
int parent


Есть список классов List<MyClass>. Это дерево. У каждого родителя может быть несколько потомков, и у каждого потомка могут быть свои потомки. Как линком выбрать всех потомков определенного узла, включая всех подпотомков?
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37971211
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asd555Привет.
Есть класс
Код: c#
1.
2.
3.
class MyClass
int id,
int parent


Есть список классов List<MyClass>. Это дерево. У каждого родителя может быть несколько потомков, и у каждого потомка могут быть свои потомки. Как линком выбрать всех потомков определенного узла, включая всех подпотомков?

полный пример вашего кода плиз У каждого родителя может быть несколько потомков, и у каждого потомка могут быть свои потомки

и конкретно, что надо выбрать
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37971246
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут
Код: 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.
    public static class TreeHelper
    {
        public static IEnumerable<T> GetDepthFirstTree<T>(T root, Func<T, IEnumerable<T>> childrenSelector)
        {
            var stack = new Stack<T>();
            stack.Push(root);
            while (stack.Count > 0)
            {
                var item = stack.Pop();
                yield return item;
                var children = childrenSelector(item);
                if (children != null)
                    foreach (var child in children.Reverse())
                        stack.Push(child);
            }
        }

        public static IEnumerable<T> GetBreadthFirstTree<T>(T root, Func<T, IEnumerable<T>> childrenSelector)
        {
            var queue = new Queue<T>();
            queue.Enqueue(root);
            while (queue.Count > 0)
            {
                var item = queue.Dequeue();
                yield return item;
                var children = childrenSelector(item);
                if (children != null)
                    foreach (var child in children)
                        queue.Enqueue(child);
            }
        }
    }

...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37971254
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asd555Привет.
Есть класс
Код: c#
1.
2.
3.
class MyClass
int id,
int parent



Есть список классов List<MyClass>. Это дерево. У каждого родителя может быть несколько потомков, и у каждого потомка могут быть свои потомки. Как линком выбрать всех потомков определенного узла, включая всех подпотомков?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
static class MyClassHelper
{
public static IEnumerable<MyClass> GetAllChilds(this IEnumerable<MyClass> myClasses, MyClass parent)
{
   var c1 = myClasses.Select(c => c.parent == parent.id);
   return c1.Union(c1.SelectMany(c => myClasses.GetAllChild(c)))
}
}
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37971257
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К
Тут
Код: 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.
    public static class TreeHelper
    {
        public static IEnumerable<T> GetDepthFirstTree<T>(T root, Func<T, IEnumerable<T>> childrenSelector)
        {
            var stack = new Stack<T>();
            stack.Push(root);
            while (stack.Count > 0)
            {
                var item = stack.Pop();
                yield return item;
                var children = childrenSelector(item);
                if (children != null)
                    foreach (var child in children.Reverse())
                        stack.Push(child);
            }
        }

        public static IEnumerable<T> GetBreadthFirstTree<T>(T root, Func<T, IEnumerable<T>> childrenSelector)
        {
            var queue = new Queue<T>();
            queue.Enqueue(root);
            while (queue.Count > 0)
            {
                var item = queue.Dequeue();
                yield return item;
                var children = childrenSelector(item);
                if (children != null)
                    foreach (var child in children)
                        queue.Enqueue(child);
            }
        }
    }




адово
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37971291
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationадовоЗато без рекурсии. OutOfMemoryException лучше чем StackOverflowException.
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37971299
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КOutOfMemoryException лучше чем StackOverflowException.
интересное мнение, никогда об этом не задумывался
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37972870
asd555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К+
Тут
Код: 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.
    public static class TreeHelper
    {
        public static IEnumerable<T> GetDepthFirstTree<T>(T root, Func<T, IEnumerable<T>> childrenSelector)
        {
            var stack = new Stack<T>();
            stack.Push(root);
            while (stack.Count > 0)
            {
                var item = stack.Pop();
                yield return item;
                var children = childrenSelector(item);
                if (children != null)
                    foreach (var child in children.Reverse())
                        stack.Push(child);
            }
        }

        public static IEnumerable<T> GetBreadthFirstTree<T>(T root, Func<T, IEnumerable<T>> childrenSelector)
        {
            var queue = new Queue<T>();
            queue.Enqueue(root);
            while (queue.Count > 0)
            {
                var item = queue.Dequeue();
                yield return item;
                var children = childrenSelector(item);
                if (children != null)
                    foreach (var child in children)
                        queue.Enqueue(child);
            }
        }
    }



Спасибо. А функция childrenSelector это что?
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37973829
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asd555Спасибо. А функция childrenSelector это что?Это делегат.
Код: c#
1.
2.
3.
4.
return TreeHelper.GetDepthFirstTree(root, parent => /*лямбда для выбора детей указанного родителя*/)
    .Where(...)
    .Select(...) // и прочие LINQ возможности
    ...
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37975766
memory1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не умею работать с делегатами. Подскажите конкретный вызов данных функций. Что передавать в параметрах чтобы получить дерево вида

....—
........—
........—

....—
........—
........—
....—
........—
........—
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37975780
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
memory1024Я не умею работать с делегатами.Зачем тебе тогда пример? Впрочем, чуть выше он уже дан.
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37975783
memory1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Чуть выше есть класс для обхода дерева. Только я не знаю как им воспользоваться.
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37975799
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
memory1024Чуть выше есть класс для обхода дерева. Только я не знаю как им воспользоваться.А это пример его использования.
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37975806
memory1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Если я напишу чтото

Код: c#
1.
2.
MyClass root = _db.MyClass.FirstOrDefault(p => p.id == 1);
return TreeHelper.GetDepthFirstTree(root, parent => parent.id == /*лямбда для выбора детей указанного родителя*/



Что можно, например, писать в лямбде?
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37975809
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asd555Как линком выбрать всех потомков определенного узла, включая всех подпотомков?memory1024Я не умею работать с делегатами.Лучше сначала научиться. Иначе ничего не выйдет. LINQ - это функциональное программирование, построенное на делегатах.
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37975811
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
memory1024Алексей К,

Если я напишу чтото

Код: c#
1.
2.
MyClass root = _db.MyClass.FirstOrDefault(p => p.id == 1);
return TreeHelper.GetDepthFirstTree(root, parent => parent.id == /*лямбда для выбора детей указанного родителя*/



Что можно, например, писать в лямбде?Нужен обход дерева из БД чтоли? Тогда всё несколько сложнее.
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37975812
memory1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Разберусь в примере и пойду читать матчасть.

Если не трудно, напишите пример любой лямбды, которую можно подставить.
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37975818
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай в БД вьюху. В неё помести рекурсивный запрос. К вьюхе обращайся из LINQ2SQL.
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37975821
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
memory1024Алексей К,

Разберусь в примере и пойду читать матчасть.

Если не трудно, напишите пример любой лямбды, которую можно подставить.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
class TreeItem
{
    public TreeItem[] Children;
}

...

TreeHelper.GetDephFirstTree(root, parent => parent.Children)


Но если речь идёт о БД - это не поможет.
...
Рейтинг: 0 / 0
Обход дерева LINQом
    #37975825
memory1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Спасибо. Я теперь примерно понял архитектуру и о чем речь.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Обход дерева LINQом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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