powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / List<T> отсортировать а-ля дерево
11 сообщений из 11, страница 1 из 1
List<T> отсортировать а-ля дерево
    #38974245
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть список записей
запись вида
Код: c#
1.
2.
3.
4.
5.
6.
7.
class Model
{
   ....
   string GUID {get;set;}
   string ParentGUID {get;set;}
   int OrderNumber {get;set;}
}



OrderNumber - это порядковый номер записи (создается по типу count+1)

Вообщем получается что в листе храним некое дерево.

Задача состоит в том, чтобы отсортировать записи в листе соответственно по типу дерева, опираясь на OrderNumber по возрастанию.
То есть как бы:
M1
M1-1
M1-1-1
M1-1-2
M1-2
M2
M2-1
и т.д

Подскажите попроще механизм... обновлять надо часто, но объемы не супер-большие, думаю до 100 записей
...
Рейтинг: 0 / 0
List<T> отсортировать а-ля дерево
    #38974303
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
List<T> отсортировать а-ля дерево
    #38974329
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tual
OrderNumber - это порядковый номер записи (создается по типу count+1)
...
M1
M1-1
M1-1-1
M1-1-2
M1-2
M2
M2-1


Думается мне, что для такой задачи в виде списка хранить дерево не очень эффективно. Но в принципе, храни у детей ссылку на родителя, по ней рекурсивно формируй М1-2-3 и сортируй.
...
Рейтинг: 0 / 0
List<T> отсортировать а-ля дерево
    #38974349
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да понятно что неэффективно. Выбора у меня нету к сожалению.. это датасоурс для кастомгрида, в котором надо как-то показать родительские отношения аля три вью.
При том что лист этот надо каждый раз пересобирать когда как минимум в него добавляется запись

Все мучаю сорт, не могу понять каким кодом обработать ситуацию, когда встречаются объект с ParentGUID и объект, который парент но для других объектов
...
Рейтинг: 0 / 0
List<T> отсортировать а-ля дерево
    #38974353
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может тут сортом не стоит извращаться, а
собрать в лист сначала объекты без парентов (по OrderNumber), потом инсертом их потомки (по OrderNumber),потом инсертом их потомки (по OrderNumber) ?
Максимальная вложенность - корень-узел-узел
...
Рейтинг: 0 / 0
List<T> отсортировать а-ля дерево
    #38974370
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
List<T> отсортировать а-ля дерево
    #38974411
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualЕсть список записей
запись вида
Код: c#
1.
2.
3.
4.
5.
6.
7.
class Model
{
   ....
   string GUID {get;set;}
   string ParentGUID {get;set;}
   int OrderNumber {get;set;}
}



OrderNumber - это порядковый номер записи (создается по типу count+1)

Вообщем получается что в листе храним некое дерево.

Задача состоит в том, чтобы отсортировать записи в листе соответственно по типу дерева, опираясь на OrderNumber по возрастанию.
То есть как бы:
M1
M1-1
M1-1-1
M1-1-2
M1-2
M2
M2-1
и т.д

Подскажите попроще механизм... обновлять надо часто, но объемы не супер-большие, думаю до 100 записей
не вникал, но если структуры менять можно то хранил бы ссылки на родителей при формировании списка, а потом ордербай по getcustomid который рекурсией создавал бы число по айдишникам.
Если нельзя менять структурку и декорировать не хочется, то словарики, иначе потенциально может тормозить
...
Рейтинг: 0 / 0
List<T> отсортировать а-ля дерево
    #38974444
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis.не вникал, но если структуры менять можно то хранил бы ссылки на родителей при формировании списка, а потом ордербай по getcustomid который рекурсией создавал бы число по айдишникам.
Если нельзя менять структурку и декорировать не хочется, то словарики, иначе потенциально может тормозить

Честно говоря не сильно понял написанного.
Я пока сделал в лоб, и мне это не нравится.
1) То есть создаем новый список
2) Линком берем корневые записи (ParentGUID == null), идем по ним форичем
3) форичем проходим по записям у которых ParentGUID равен корневой
4) то же самое (второй уровень вложенности)
Рекурсий никаких нет, общая структура дерева (используемые бизнес-объекты) крайне врядли будет меняться
...
Рейтинг: 0 / 0
List<T> отсортировать а-ля дерево
    #38974452
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или тут имелось ввиду создать доп проперти в классе под названием SortedIndex, по которой и делать OrderBy ?
Проперти добавить можно, не проблема.

А вот что за рекурсию тут применить я не понял.
...
Рейтинг: 0 / 0
List<T> отсортировать а-ля дерево
    #38974520
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tual,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
     public static IEnumerable<Model> Sort(IEnumerable<Model> list, string parent)
        {
            var first = list.Where(x => x.ParentGUID == parent).OrderBy(x => x.OrderNumber);
            foreach (var x in first)
            {
                yield return x;
                foreach (var y in Sort(list,x.GUID))
                {
                    yield return y;
                }
            }
        }
...
Рейтинг: 0 / 0
List<T> отсортировать а-ля дерево
    #38974594
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВtual,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
     public static IEnumerable<Model> Sort(IEnumerable<Model> list, string parent)
        {
            var first = list.Where(x => x.ParentGUID == parent).OrderBy(x => x.OrderNumber);
            foreach (var x in first)
            {
                yield return x;
                foreach (var y in Sort(list,x.GUID))
                {
                    yield return y;
                }
            }
        }


можно еще сделать Lookup и сразу получать перечисление по ключу, как вариант :)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / List<T> отсортировать а-ля дерево
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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