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

时间:2018-10-10 16:51:31

标签: c# linq hierarchical-data flatten

免责声明:从两天以来,我一直在与这个问题作斗争(我在SO上读过很多类似的问题)。通过Linq并寻求帮助。

类结构

enter image description here enter image description here

填充样本数据

我有一个<tr [pSelectableRow]="rowData"> <td *ngFor="let col of columns"> <ng-container *ngIf="(rowData[col.type] == 'Date'); else defaultTemplate;"> <span>{{rowData[col.field] | date:'dd/MM/yyyy'}}</span> </ng-container> <ng-template #defaultTemplate> <span>{{rowData[col.field] }}</span> </ng-template> </td> </tr> 的列表。每个Macrotab对象都包含Macrotab的列表。 每个Tab对象内部都有Tab

Slot

*为了使问题易于阅读,我将填充一组示例数据的CreateHierarchaldata移动到.NetFiddle:https://dotnetfiddle.net/8mF1qI

平移

以下几行使用Linq 展平此结构:

List<MacroTab> hierarchaldata = CreateHierarchaldata();

将数据聚合回层次结构

我尝试使用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(); 回到原始列表。这是我的目标:汇总MacroTab,Tab和Slot的ID的数据并重新创建原始列表,但无法按预期工作**:

Linq Group By

**属性HelperClass仅用于调试目的,希望它不会引起混淆,我将其保留下来以解释Visual Studio调试器的屏幕截图

enter image description here

Try it on Fiddler

1 个答案:

答案 0 :(得分: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();