Linq: перестроить иерархические данные из плоского списка - PullRequest
0 голосов
/ 10 октября 2018

Отказ от ответственности: Я боролся с этой проблемой уже 2 дня (я читал много похожих вопросов по SO) .. так что наберитесь терпения, я что-то упускаю из группыс Linq и с просьбой о помощи.

Структура классов

enter image description here enter image description here

Заполнение данных выборки

У меня есть список Macrotab.Каждый объект Macrotab содержит список Tab.Каждый Tab объект внутри с Slot внутри.

List<MacroTab> hierarchaldata = CreateHierarchaldata();

* Для удобства чтения я переместил CreateHierarchaldata, который заполняет набор данных примера, в .NetFiddle: https://dotnetfiddle.net/8mF1qI

Сглаживание

Следующие строки Сглаживание Эта структура с использованием Linq:

var flattenedList = (from macroTab in hierarchaldata
            from tab in macroTab.Tabs
            from slot in tab.Slots
            select new {macroTab.IDMacroTab, tab.IDTab, slot.IDSlot}).ToList();

Агрегирование данных обратно в иерархию

Я пытался вернуться к исходному списку , используя Linq Group By.Это было моей целью: объединить данные для идентификатора MacroTab, вкладок и слотов и воссоздать исходный список, но он не работает должным образом **:

var antiflatten = from macrotab in flattenedList
            group macrotab by new {macrotab.IDMacroTab}
            into macrotabs
            let macrotabFirst = macrotabs.First()
            select new MacroTab
            {
                IDMacroTab = macrotabFirst.IDMacroTab,
                Tabs = (from macrotab in macrotabs
                    group macrotabs by new {macrotab.IDTab}
                    into tabs
                    let tabFirst = tabs.First()
                    select new Tab(){ HelperClass = tabFirst}).ToList()
            };

** Свойство HelperClassэто просто для целей отладки, надеюсь, это не смущает, я оставил его, чтобы объяснить скриншот отладчика Visual Studio

enter image description here

Попробуйтена скрипаче

1 Ответ

0 голосов
/ 10 октября 2018
    var macroTabs = flattenedList
        .GroupBy(x => x.IDMacroTab)
        .Select((x) => new MacroTab
        {
            IDMacroTab = x.Key,
            Tabs = x.GroupBy(t => t.IDTab)
                    .Select(tx => new Tab {
                        IDTab = tx.Key,
                        Slots = tx.Select(s => new Slot {
                           IDSlot = s.IDSlot
                     }).ToList()
            }).ToList()
        }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...