Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
1

Получить всех потомков(все вхождения)

06.08.2020, 20:50. Показов 921. Ответов 7

Author24 — интернет-сервис помощи студентам
Добрый вечер
Есть класс

C#
1
2
3
4
5
class User
{
  public int ID {get;set;}
  public int? UserParentID {get;set;}
}
где
UserParentID - это идентификатор User, которому он подчиняется

Есть список Users

ID 1 UserParentID null
ID 2 UserParentID 1
ID 3 UserParentID 2
ID 4 UserParentID 3
ID 5 UserParentID 2
ID 6 UserParentID 3
ID 7 UserParentID 4
ID 8 UserParentID 4
ID 9 UserParentID 5
ID 10 UserParentID 8

Нужно получить всех пользователей(включая его самого) которых "крышует" User с ID 1
Ожидаемый результат, список пользователей с ID:
1(он сам),2,3,4,7,8,10

Добавлено через 4 минуты
так же нужно вычислить число максимального уровня вложенности по идентификатору пользователя, и сделать возможность задавать уровень "спускания" вниз, пользователи ниже этого уровня не должны попадать в результирующий список.
По умолчанию, уровень спускания максимальный

Помогите пожалуйста
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2020, 20:50
Ответы с готовыми решениями:

Как получить список всех потомков класса
Добрый день. У меня есть некоторый абстрактный класс. ОТ него происходят куча других классов....

Как запросом LINQ получить все вхождения строки?
Как обычно, пока писал текст, сам допёр до решения. Запрос: Query =...

Не могу получить все вхождения по шаблону.
Добрый день, пытаюсь вытащить из строки совпадения по маске, но получается вытащить только 1...

Из файла А получить файл В, исключив все повторные вхождения чисел
Заполнить текстовый файл А случайными числами. Из файла А получить файл В, исключив все повторные...

7
1842 / 1184 / 501
Регистрация: 14.10.2018
Сообщений: 3,180
06.08.2020, 21:00 2
Только делал на днях Необходимо вывести данные в виде дерева
Хотя если честно - реализацию я бы переделал
0
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
06.08.2020, 21:56  [ТС] 3
Enifan, не нужно выводить данные в виде дерева, нужно все уровни цепочки положить в один конечный результирующий список

Добавлено через 45 минут
что-то сутки бьюсь с этим, и не как, похоже я перегорел...
0
1842 / 1184 / 501
Регистрация: 14.10.2018
Сообщений: 3,180
06.08.2020, 22:00 4
Цитата Сообщение от UseMuse Посмотреть сообщение
что-то сутки бьюсь
чтобы сделать эту задачу "корректно", в идеале создать дополнительный класс дерева + дополнить класс User. Условия задачи это позволяют?
0
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
06.08.2020, 22:05  [ТС] 5
Enifan, User класс это entity от entity framework, ее не желательно модифицировать отлично от БД
Результат нужен в виде
List<User> usersResult;
usersResult : где у них будут ID равные 1,2,3,4,7,8,10, если искать все подчинённые звенья под User с ID = 1
0
1842 / 1184 / 501
Регистрация: 14.10.2018
Сообщений: 3,180
06.08.2020, 22:20 6
Цитата Сообщение от UseMuse Посмотреть сообщение
usersResult : где у них будут ID равные 1,2,3,4,7,8,10
а почему числа 5,6 и 9 не попадают в этот список ? ведь их "предки" находятся в результате ?

Добавлено через 1 минуту
Я это к тому, что написанный мной алгоритм нашел то, чего не нашел я
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
using System;
using System.Collections.Generic;
 
class User
{
    public int ID { get; set; }
    public int? UserParentID { get; set; }
}
 
class Program
{
    static void Main()
    {
        List<User> users = new List<User>()
        {
            new User { ID = 1, UserParentID = null },
            new User { ID = 2, UserParentID = 1 },
            new User { ID = 3, UserParentID = 2 },
            new User { ID = 4, UserParentID = 3 },
            new User { ID = 5, UserParentID = 2 },
            new User { ID = 6, UserParentID = 3 },
            new User { ID = 7, UserParentID = 4 },
            new User { ID = 8, UserParentID = 4 },
            new User { ID = 9, UserParentID = 5 },
            new User { ID = 10, UserParentID = 8 }
        };
 
        List<User> result = Foo(users, 1);
 
        foreach (var user in result)
            Console.WriteLine(user.ID);
 
        Console.ReadKey();
    }
 
    static List<User> Foo(List<User> lst, int ID)
    {
        List<User> result = new List<User>();
        var first = lst.Find(user => user.ID == ID);
        if (first == null)
            return null;
        result.Add(first);
        Foo(ID);
 
        void Foo(int id)
        {
            var users = lst.FindAll(user => user.UserParentID == id);
            foreach (var user in users)
            {
                result.Add(user);
                Foo(user.ID);
            }
        }
 
        return result;
    }
}
1
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
06.08.2020, 23:10  [ТС] 7
Enifan,
Цитата Сообщение от Enifan Посмотреть сообщение
а почему числа 5,6 и 9 не попадают в этот список ?
моя ошибка, проглядел, они должны тоже попасть были
0
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
07.08.2020, 09:26  [ТС] 8
Enifan, я решил эту задачу так
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
using System;
using System.Collections.Generic;
using System.Linq;
 
class User
{
    public int ID { get; set; }
    public int? UserParentID { get; set; }
}
 
class Program
{
    static List<User> users = new List<User>()
        {
            new User { ID = 1, UserParentID = null },
            new User { ID = 2, UserParentID = 1 },
            new User { ID = 3, UserParentID = 2 },
            new User { ID = 4, UserParentID = 3 },
            new User { ID = 5, UserParentID = 2 },
            new User { ID = 6, UserParentID = 3 },
            new User { ID = 7, UserParentID = 4 },
            new User { ID = 8, UserParentID = 4 },
            new User { ID = 9, UserParentID = 5 },
            new User { ID = 10, UserParentID = 8 }
        };
    static void Main()
    {
        var topUser = users.Single(u=>u.ID ==1);
        var descendants = Descendants(topUser).OrderBy(u=>u.ID);
 
 
        foreach (var user in descendants)
            Console.WriteLine(user.ID);
 
        //Console.WriteLine(new string('*',20));
 
        //IEnumerable<User> result = Foo(users, 1).OrderBy(u => u.ID);
 
        //foreach (var user in result)
        //    Console.WriteLine(user.ID);
 
        Console.ReadKey();
 
    }
    static IEnumerable<User> Descendants(User root)
    {
        var nodes = new Stack<User>(new[] { root });
        while (nodes.Any())
        {
            User node = nodes.Pop();
            yield return node;
 
            var Children = users.Where(u => u.UserParentID == node.ID);
 
            foreach (var n in Children) nodes.Push(n);
        }
    }
       //static List<User> Foo(List<User> lst, int ID)
    //{
    //    List<User> result = new List<User>();
    //    var first = lst.Find(user => user.ID == ID);
    //    if (first == null)
    //        return null;
    //    result.Add(first);
    //    Foo(ID);
 
    //    void Foo(int id)
    //    {
    //        var users = lst.FindAll(user => user.UserParentID == id);
    //        foreach (var user in users)
    //        {
    //            result.Add(user);
    //            Foo(user.ID);
    //        }
    //    }
 
    //    return result;
    //}
}
0
07.08.2020, 09:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2020, 09:26
Помогаю со студенческими работами здесь

Как изменить все вхождения, но перед этим получить найденный текст?
Здравствуйте, есть вопрос. В JS я не ахти, однако понадобилось реализовать одну штуку. Нужно...

Вернуть сумму кодов всех элементов массива и заменить все вхождения символа «#» на букву А
вот задание: Написать функцию, которая для заданного в качестве пара метра массива типа char...

Из строки получить новую, выбросив все вхождения заданного символа (Работа со строками)
Доброго времени суток =) Нужна помощь с заданием: &quot;Из заданной строки получить новую, выбросив из...

Во всех словах предложения, отличных от последнего слова, удалить все предыдущие вхождения последней буквы
Задание. Дана последовательность, содержащая слова, в каждом из которых от 1 до 8 строчных...

Получить новую строку, в которой удалены все возможные повторные вхождения каждого слова
текст программы на языке Object Pascal в системе программирования Delph Задана строка символов,...

Получить новый файл, в котором все вхождения первого слова заменены на второе слово
Доброго времени суток, уважаемые программисты со стажем. Мне программирование, как таковое, не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru