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);