Oxy*_*ron 2 c# foreach parent-child
处理此方案的最佳方法是什么
foreach (var level1 in Levels.Where(l => l.PARENTID == 0))
{
// Print "LEVEL 1: Title"
foreach (var level2 in Levels.Where(l => l.PARENTID == level1.ROOTID))
{
// Print "Level 2: Sub Title"
foreach (var level3 in Levels.Where(l => l.PARENTID == level2.ROOTID))
{
// Print "Level 3: Header"
... etc ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
我会使用递归来做到这一点
void ProcessLevels(IEnumerable<Level> levels, int parentID, int levelNum)
{
foreach (var subLevel in levels.Where(l => l.PARENTID == parentID))
{
//print Level levelNum
//use logic to format according to the specific level if desired
ProcessLevels(levels, subLevel.ROOTID, levelNum + 1);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以随后调用它
ProcessLevels(levels, 0, 1);
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,如果您的水平深度超过3深,它将继续处理链条.您可以通过执行以下操作将其限制在3级(或您选择的任何级别):
void ProcessLevels(IEnumerable<Level> levels, int parentID, int levelNum, int levelsDeep)
{
foreach (var subLevel in levels.Where(l => l.PARENTID == parentID))
{
//print Level levelNum
//use logic to format according to the specific level if desired
if (levelsLeft > 0)
{
ProcessLevels(levels, subLevel.ROOTID, levelNum + 1, levelsDeep - 1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并打电话给你:
ProcessLevels(levels, 0, 1, 3);
Run Code Online (Sandbox Code Playgroud)