powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Шарпей не тянет?
33 сообщений из 33, показаны все 2 страниц
Шарпей не тянет?
    #39654165
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой вот вброс. Всю башню себе выломал.

Есть такая штука:

Код: c#
1.
IEnumerable<IGrouping<'a>> something;



Расположены в правильном порядке.
Количество неизвестно.

Нужно составить дерево из этого добра, группируя по условиям, которые находятся в 'a

Пытаюсь заюзать aggregate, по концепции то, что надо.

То есть:

Код: c#
1.
something.aggregate((result,next)=> result.GroupBy(x=> returnElementFromNext(x)))



Но GroupBy возвращает
Код: c#
1.
IEnumerable<IGrouping<'a>>

, ну а по сигнатуре надо
Код: c#
1.
IGrouping<'a>

.

Как быть?

Хочу сделать с LINQ, то есть без ручных обходов в императивном стиле.
Хочу сделать с анонимными классами (не хочу создавать класс для этой операции).


P.S. То есть -
Код: c#
1.
IEnumerable<IGrouping<'a>> something;

- эта штука - перечисление элементов, которые лежат на одном уровне дерева. И их надо "просто" вложить в друг-друга.

Если чо - заготова.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
                var arrayFirst = new[]
                {
                    new { bound = 1, value = "something on top" },
                    new { bound = 10, value = "on top too" },
                    new { bound = 30, value = "on top at end" }
                };

                var arraySlave = new[] {
                    new { bound = 2, value = "slaveOne" },
                    new { bound = 15, value = "second slave" },
                    new { bound = 37, value = "slave on end" }
                };

                var mainArray = new[] { arrayFirst, arraySlave }; //Вот этот парень.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654213
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомНо GroupBy возвращает
Код: c#
1.
IEnumerable<IGrouping<'a>>


, ну а по сигнатуре надо
Код: c#
1.
IGrouping<'a>



Очень-очень странный запрос... Ну сделай First/Single, хотя и бред, но получишь свой IGrouping ))

Материализацию дерева из плоской коллекции без рекурсива, или yield, или стека, или промежуточного словаря -- не получить.


Агнец за бортомЕсли чо - заготова.

Исходный лист давай.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654220
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМатериализацию дерева из плоской коллекции без рекурсива, или yield, или стека, или промежуточного словаря -- не получить.
Ну почему? Если коллекция упорядочена и в элементах указывать индекс родителя, то ForEach и все.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654223
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttИсходный лист давай

В исходном - дерево строк в экселе
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654227
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRНу почему? Если коллекция упорядочена и в элементах указывать индекс родителя, то ForEach и все.

Упорядочена каким образом?
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654228
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомhVosttИсходный лист давай

В исходном - дерево строк в экселе

Ну пример исходного массива, хотя бы из трёх элементов дай.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654235
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttLRНу почему? Если коллекция упорядочена и в элементах указывать индекс родителя, то ForEach и все.

Упорядочена каким образом?
Таким, чтобы по указанному индексу находился родитель.
Код: c#
1.
2.
3.
4.
5.
6.
7.
var arr = new[] { new { parentID = -1, name = "root", childs = new List<object>() },
    new { parentID = 0, name = "node-1", childs = new List<object>() },
    new { parentID = 0, name = "node-2", childs = new List<object>() },
    new { parentID = 1, name = "node-1-1", childs = new List<object>() },
    new { parentID = 1, name = "node-1-2", childs = new List<object>() },
    new { parentID = 2, name = "node-2-1", childs = new List<object>() } };
arr.Where(x => x.parentID >= 0).ToList().ForEach(x => arr[x.parentID].childs.Add(x));
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654250
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRТаким, чтобы по указанному индексу находился родитель.

Ну, короче, словарь. Да, я об этом и говорил.


hVosttили промежуточного словаря
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654251
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR
Код: c#
1.
.ForEach(x => arr[x.parentID].childs.Add(x));



И опять таки, ForEach, это читерство, так как по сути это обычный цикл, а ТС хочет чистой функциональщины :)
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654259
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНу, короче, словарь. Да, я об этом и говорил.


hVosttили промежуточного словаря
Тогда что есть "плоская коллекция" из которой надобно дерево "материализовывать"?

hVosttИ опять таки, ForEach, это читерство, так как по сути это обычный цикл, а ТС хочет чистой функциональщины :)
Так весь Linq - это обычные циклы:) А чего хочет ТС я так и не понял:)
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654265
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRчего хочет ТС я так и не понял

Чистая функция - знаешь, что это такое?
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654273
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRТогда что есть "плоская коллекция" из которой надобно дерево "материализовывать"?

Коллекция объектов, у которых есть ID и Parent ID.

Вообще, на LINQ можна

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    class Item
    {
        public int Id { get; set; }

        public int? ParentId { get; set; }

        public string Name { get; set; }
    }

    IEnumerable<Item> list = ...
 
    var tree = list
        .Aggregate(
            ((IEnumerable<(Item, Item[])>)(new(Item, Item[])[0]), list.ToLookup(p => p.ParentId)),
            (a, e) => (a.Item1.Concat(new[] { (e, a.Item2[e.Id].ToArray()) }), a.Item2))
        .Item1
        .Where(p => p.Item1.ParentId == null);



в tree будут корни...
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654278
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttа ТС хочет чистой функциональщины :)
Тогда для чистоты эксперимента надо использовать F#.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654292
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныhVosttа ТС хочет чистой функциональщины :)
Тогда для чистоты эксперимента надо использовать F#.+1
ТС не перебарщивай с Linq.
Циклы это не зло).
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654293
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомhVosttИсходный лист давай

В исходном - дерево строк в экселехороший прыжок ...из экселя сразу в функциональный ЯП )).
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654297
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttLRТогда что есть "плоская коллекция" из которой надобно дерево "материализовывать"?

Коллекция объектов, у которых есть ID и Parent ID.

Вообще, на LINQ можна

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    class Item
    {
        public int Id { get; set; }

        public int? ParentId { get; set; }

        public string Name { get; set; }
    }

    IEnumerable<Item> list = ...
 
    var tree = list
        .Aggregate(
            ((IEnumerable<(Item, Item[])>)(new(Item, Item[])[0]), list.ToLookup(p => p.ParentId)),
            (a, e) => (a.Item1.Concat(new[] { (e, a.Item2[e.Id].ToArray()) }), a.Item2))
        .Item1
        .Where(p => p.Item1.ParentId == null);




в tree будут корни...


Только "есть нюанс".

1. Класс с данными - анонимный.
2. Ссылки на родителя нет. (Не самая проблема)
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654312
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомLRчего хочет ТС я так и не понял

Чистая функция - знаешь, что это такое?Нет. Но попробую угадать: это нечто противоположное грязной функции, верно?

hVosttКоллекция объектов, у которых есть ID и Parent ID.Ну, короче, словарь :)
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654364
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом1. Класс с данными - анонимный.
2. Ссылки на родителя нет. (Не самая проблема)

Тогда только так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
// чтобы получать вложенные
var children =  anonymousList.ToLookup(p => p.ParentID);
// чтобы получать родителя
var parents = anonymousList.ToDictionary(p => p.ID);
// материализуем дерево
var tree = anonymousList
   .Select(item => new { 
      item, 
      parent = item.ParentID == null ? null : parents[item.ParentID.Value],
      children = children[item.ID]
    })
    .Where(p => p.item.ParentID == null)
    .ToList();
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654379
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

А на JS, к слову - вообще без заморочек.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654397
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомhVostt,

А на JS, к слову - вообще без заморочек.

Пример в студию.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654480
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПример в студию.
+1
В каждом ЯП свои подходы и границы "правильного" и "неправильного" в кавычках.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654736
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шарпей всё же "не тянет".


Агнец за бортомХочу сделать с анонимными классами (не хочу создавать класс для этой операции).

Вот это условие выполнить не удалось, в силу типизированной природы шарпа..

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
    
public class node 
    {

        public int row { get; set; }
        public String value { get; set; }     
        public node[] childs{get;set;}      
    }



Вот такой класс создать всё же пришлось.

Поскольку:
1. Уровни вложенности не ограниченны.
2. Через generic интерфейсы тип для Aggregate не задать (из-за п.1), а подчиненность выразить как-то надо.

Пришлось мутить такой вот класс.

Итоговый код - "две строчки".

Жаль, что не удалось на анонимных классах сделать.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654742
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомЖаль, что не удалось на анонимных классах сделать.

На кортежах делается же.

Тебе какой больше по душе -- Tuple, ValueTuple?
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654746
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример кода.

Код: 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.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace PIC_
{
    class nodeComparer : IEqualityComparer<node>
    {
        public bool Equals(node x, node y)
        {
            return x.row == y.row;
        }

        public int GetHashCode(node obj)
        {
            return obj.row.GetHashCode();
        }
    }
    public class node
    {

        public int row { get; set; }
        public String value { get; set; }
        public node[] childs { get; set; }
    }

    public static class treeBuilder
    {
        public static void build()
        {
            var arrayFirst = new[]
            {
                    new { row = 1, value = "something on top" },
                    new { row = 10, value = "on top too" },
                    new { row = 30, value = "on top at end" }
                };

            var arraySlave = new[] {
                    new { row = 2, value = "slaveOne" },
                    new { row = 15, value = "second slave" },
                    new { row = 37, value = "slave on end" }
                };

            var mainArray = new[] { arrayFirst, arraySlave }; //Вот этот парень.

            var finalTest = mainArray.Reverse().Select(x => x.Select(c => new node { row = c.row, value = c.value })
                            .OrderBy(c => c.row)
                            .AsEnumerable())
           .Aggregate((result, nextnode) => result.GroupBy(x => nextnode.Where(masterNode => masterNode.row < x.row)
                            .OrderByDescending(c => c.row).FirstOrDefault(), new nodeComparer())
                            .Select(x => new node { row = x.Key.row, value = x.Key.value, childs = x.ToArray() })
           );
        }
    }
}
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654753
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttТебе какой больше по душе -- Tuple, ValueTuple?

После того, как RAZOR не смог прожевать

Код: c#
1.
Tuple<int,int,int>

- я не люблю ЭТО.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39654788
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомсилу типизированной природы шарпа..это плюс в энтерпрайзе.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39655740
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,

У меня жуёт.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39655770
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАгнец за бортом,

У меня жуёт.

Попробовал?

Передал Tuple<int,int,int> как модель?
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39655776
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомПопробовал?

Передал Tuple<int,int,int> как модель?

Конечно. Но мы так не делаем. Все Tuple's используются только исключительно внутри реализации. Никогда как часть контракта, публичного транспорта, или в качестве моделей представления.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39655823
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttКонечно

Прикол в том, что не "конечно".

Видимо поправили, но в какой-то момент - это не работало.

Смешно, но это так.

При передаче tuple как модели - нельзя было, что бы типы повторялись друг за другом.

То есть

Tuple<int,string,int> - можно,

а

Tuple<int,int,string> - нельзя.

Типа (как я понял) RAZOR создаёт модель (или только TUPLE) заново, и не может определить "кто-есть-кто".
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39655830
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,

Возможно ты и прав. Но я не сталкивался, потому что мы используем строго типизированные вью модели. Везде. Даже в JavaScript.
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39655837
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАгнец за бортом,

Возможно ты и прав. Но я не сталкивался, потому что мы используем строго типизированные вью модели. Везде. Даже в JavaScript.


Ну вот
...
Рейтинг: 0 / 0
Шарпей не тянет?
    #39655875
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,

Да, я нашёл ишью, но это уже в прошлом ))
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Шарпей не тянет?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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