代码之家  ›  专栏  ›  技术社区  ›  Revious

Linq:从展平列表重建层次结构数据

  •  1
  • Revious  · 技术社区  · 6 年前

    免责声明: 我已经和这个问题斗争了两天了(我在网上读了很多类似的问题)。。所以耐心点,我错过了一些关于Linq和寻求帮助的小组。

    阶级结构

    enter image description here enter image description here

    我有一份 Macrotab 宏表 对象包含 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

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

    enter image description here

    Try it on Fiddler

    1 回复  |  直到 6 年前
        1
  •  1
  •   Akash Kava    6 年前
        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();