Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多个Foreach循环通过父/子循环_C#_Foreach_Parent Child - Fatal编程技术网

C# 多个Foreach循环通过父/子循环

C# 多个Foreach循环通过父/子循环,c#,foreach,parent-child,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)) {

处理这种情况的最佳方法是什么

        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 ...
                }
            }
        }

我将使用递归来实现这一点

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

这很好。“最佳方式”是指“LINQ方式”吗?为每个
级别
提供一组
级别
并递归循环。您最终建立了一个层次结构。您不必传入
LevelNum
。使用您输入的逻辑,您可以只打印
ParentID+1
并删除参数。
LevelsClass
应该类似于
IEnumerable
@NickStrupat good point,我只是在犹豫是否要猜出教室里没有的班级名称OP@TyCobb我不明白如果没有一些参数,你怎么能知道你在树上有多深
parentID
我不认为它是一个级别计数器,它更像是一个数据库ID,级别2的每个项目都有一个不同的ID,他们的孩子会引用它
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);