Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Шарпей не тянет? / 25 сообщений из 33, страница 1 из 2
01.06.2018, 18:10
    #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
01.06.2018, 20:18
    #39654213
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шарпей не тянет?
Агнец за бортомНо GroupBy возвращает
Код: c#
1.
IEnumerable<IGrouping<'a>>


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



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

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


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

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

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

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

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

Ну пример исходного массива, хотя бы из трёх элементов дай.
...
Рейтинг: 0 / 0
01.06.2018, 22:52
    #39654235
LR
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
02.06.2018, 00:03
    #39654250
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шарпей не тянет?
LRТаким, чтобы по указанному индексу находился родитель.

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


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



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


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

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

Чистая функция - знаешь, что это такое?
...
Рейтинг: 0 / 0
02.06.2018, 02:34
    #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
02.06.2018, 03:50
    #39654278
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шарпей не тянет?
hVosttа ТС хочет чистой функциональщины :)
Тогда для чистоты эксперимента надо использовать F#.
...
Рейтинг: 0 / 0
02.06.2018, 08:55
    #39654292
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шарпей не тянет?
Сон Веры ПавловныhVosttа ТС хочет чистой функциональщины :)
Тогда для чистоты эксперимента надо использовать F#.+1
ТС не перебарщивай с Linq.
Циклы это не зло).
...
Рейтинг: 0 / 0
02.06.2018, 08:57
    #39654293
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шарпей не тянет?
Агнец за бортомhVosttИсходный лист давай

В исходном - дерево строк в экселехороший прыжок ...из экселя сразу в функциональный ЯП )).
...
Рейтинг: 0 / 0
02.06.2018, 09:42
    #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
02.06.2018, 10:30
    #39654312
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шарпей не тянет?
Агнец за бортомLRчего хочет ТС я так и не понял

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

hVosttКоллекция объектов, у которых есть ID и Parent ID.Ну, короче, словарь :)
...
Рейтинг: 0 / 0
02.06.2018, 17:21
    #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
02.06.2018, 18:42
    #39654379
Агнец за бортом
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шарпей не тянет?
hVostt,

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

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

Пример в студию.
...
Рейтинг: 0 / 0
03.06.2018, 13:10
    #39654480
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шарпей не тянет?
hVosttПример в студию.
+1
В каждом ЯП свои подходы и границы "правильного" и "неправильного" в кавычках.
...
Рейтинг: 0 / 0
04.06.2018, 11:03
    #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
04.06.2018, 11:14
    #39654742
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шарпей не тянет?
Агнец за бортомЖаль, что не удалось на анонимных классах сделать.

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

Тебе какой больше по душе -- Tuple, ValueTuple?
...
Рейтинг: 0 / 0
04.06.2018, 11:20
    #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
04.06.2018, 11:27
    #39654753
Агнец за бортом
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шарпей не тянет?
hVosttТебе какой больше по душе -- Tuple, ValueTuple?

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

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

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


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