嵌套foreach依赖前序变量,寻求更高效的循环实现方案
优化嵌套foreach循环为动态迭代的while循环
我写了一段能正常运行的嵌套foreach代码,通过循环调用createNewList生成新列表,具体实现如下:
data = new List<string>(); // 初始化字符串列表 foreach (var str in data) { data = createNewList(str); // 用当前字符串生成新列表 foreach (var str2 in data) { data = createNewList(str2); // 用新列表中的字符串再生成新列表 foreach (var str3 in data) { data = createNewList(str3); foreach (var str4 in data) { // 以此类推,需要不断嵌套下去... } } } }
但这个实现太啰嗦,不够优雅,我想改用while循环来优化。尝试了下面的代码,虽然没报错,但只执行了一次迭代,我需要的是只要能生成非空子列表,就持续循环:
dataSingles = addFolderItemsList(sourcelist); foreach (NodeN node in dataSingles) { while (flag > 0) { flag = 0; foreach (NodeN subnode in dataSingles) { dataSingles = addFolderItemsList(subnode.ChildrenN); if (dataSingles.Count() > 0) { flag = 1; } } } }
问题分析
当前的while循环代码有两个核心问题:
flag初始值未设置:进入while循环前flag默认是0,直接跳过循环- 遍历中直接覆盖列表:迭代过程中替换
dataSingles,导致后续遍历的是新列表而非原列表,且只保留最后一次生成的结果
正确实现(动态迭代直到无子列表)
如果需求是逐层迭代,只要当前层元素能生成非空子列表,就继续迭代下一层,可以用以下方式实现,无需嵌套foreach,用while循环动态处理每一层:
// 初始化第一层列表 var currentLayer = addFolderItemsList(sourcelist); // 只要当前层有元素,就继续迭代 while (currentLayer.Any()) { // 存储下一层的所有元素 var nextLayer = new List<NodeN>(); foreach (var node in currentLayer) { // 生成当前节点的子列表 var children = addFolderItemsList(node.ChildrenN); // 将子元素加入下一层列表 nextLayer.AddRange(children); } // 替换为下一层,进入下一轮循环 currentLayer = nextLayer; }
说明
- 用
currentLayer存储当前迭代的层级列表,nextLayer收集下一层所有子元素 - 每次循环处理当前层的所有节点,生成子元素后统一替换为下一层
- 当
currentLayer为空时自动终止循环,完美实现"只要能生成子列表就持续循环"的需求
如果需要在每一层做额外处理(比如打印、记录数据),直接在foreach (var node in currentLayer)循环中加入对应逻辑即可。
内容的提问来源于stack exchange,提问作者ng80092b
相关产品推荐
相关产品推荐

