【问题标题】:Linq: rebuild hierarchical data from the flattened listLinq:从扁平列表重建分层数据
【发布时间】:2019-03-15 15:48:07
【问题描述】:

免责声明: 2 天以来我一直在与这个问题作斗争(我已经阅读了很多关于 SO 的类似问题).. 所以请耐心等待,我错过了有关小组的一些内容通过使用 Linq 并寻求帮助。

类结构

填充样本数据

我有一个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、选项卡和插槽的 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

【问题讨论】:

    标签: c# linq hierarchical-data flatten


    【解决方案1】:
        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();
    

    【讨论】:

    • 我尝试将方法链转换为普通的 Linq sintax,但我又失败了……您有什么建议吗?
    • 老实说,我也试过了,我觉得像上面这样的方法语法更舒服,我们知道代码是如何流动的。
    • 我认为您的解决方案确实更清晰易读,但为了知识起见,我在这里打开了一种 Linq 挑战:stackoverflow.com/questions/52757509/…
    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多