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 调试器的截图
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();
免责声明: 我从 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 调试器的截图
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();