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

时间:2014-04-09 21:43:53

标签: 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 ...
                }
            }
        }

1 个答案:

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

您可以使用

调用它
ProcessLevels(levels, 0, 1);

这样做的好处是,如果您的水平深度超过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);
        }
    }
}

拨打电话:

ProcessLevels(levels, 0, 1, 3);