Linq:从展平列表重建分层数据

Linq: rebuild hierarchical data from the flattened list

免责声明: 我从 2 天起就一直在与这个问题作斗争(我在 SO 上阅读了很多类似的问题)..所以请耐心等待,我缺少有关 Linq Group By 的信息并寻求帮助。

Class 结构

填充示例数据

我有一个 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返回原始列表。这是我的 objective:聚合 MacroTab、Tabs 和 Slots 的 Id 数据并重新创建原始列表,但它没有按预期工作**:

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 调试器的截图

Try it on Fiddler

    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();