多个Foreach循环通过父母的孩子

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)

Sam*_*Sam 6

我会使用递归来做到这一点

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)