C# Linq:从展开列表重建分层数据

C# Linq:从展开列表重建分层数据,c#,linq,hierarchical-data,flatten,C#,Linq,Hierarchical Data,Flatten,免责声明:我从两天以来一直在与这个问题作斗争(我已经阅读了很多类似的问题)。。所以请耐心点,我和林克在一起并寻求帮助时遗漏了一些关于小组的信息 阶级结构 填充样本数据 我有一个宏选项卡的列表。每个Macrotab对象都包含Tab的列表。 每个选项卡内有插槽的对象 List<MacroTab> hierarchaldata = CreateHierarchaldata(); 将数据聚合回层次结构 我尝试使用Linq组返回原始列表。这就是我的目标:聚合宏选项卡、选项卡和插槽Id的数

免责声明:我从两天以来一直在与这个问题作斗争(我已经阅读了很多类似的问题)。。所以请耐心点,我和林克在一起并寻求帮助时遗漏了一些关于小组的信息

阶级结构

填充样本数据 我有一个
宏选项卡的列表
。每个
Macrotab
对象都包含
Tab
的列表。 每个
选项卡
内有
插槽
的对象

List<MacroTab> hierarchaldata = CreateHierarchaldata();
将数据聚合回层次结构 我尝试使用
Linq组返回原始列表。这就是我的目标:聚合宏选项卡、选项卡和插槽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只是为了调试,我希望它不会让人困惑,我留下它来解释VisualStudio调试器的屏幕截图


我试图将方法链转换为正常的Linq sintax,但再次失败。。。你有什么建议吗?老实说,我也尝试过,我对上面的方法语法感觉更舒服,因为我们知道代码是如何流动的。我认为你的解决方案确实更清晰易读,但为了了解情况,我在这里提出了一种Linq挑战:
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()
            };
    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();