求助:简化C#中嵌套五层foreach循环的代码
简化多层嵌套循环的方案
针对你这段多层嵌套的代码,我们可以通过LINQ扁平化集合+拆分逻辑方法的方式,在完全保留原有业务逻辑的前提下大幅简化代码结构,提升可读性。
1. 先拆分row生成逻辑
把原代码里的4个Operation提取成独立方法,让每个逻辑职责单一:
// 对应原Operation1:处理acLevel层级 private TBRow CreateRowFromAcLevel(YourAcLevelType acLevel) { // 这里写原Operation1的实现逻辑 return new TBRow(...); } // 对应原Operation2:ruLevel无Details时的处理 private TBRow CreateRowFromRuLevel(YourRuLevelType ruLevel) { // 这里写原Operation2的实现逻辑 return new TBRow(...); } // 对应原Operation3:tLevel无Details时的处理 private TBRow CreateRowFromTLevel(YourTLevelType tLevel) { // 这里写原Operation3的实现逻辑 return new TBRow(...); } // 对应原Operation4:data无Details时的处理 private TBRow CreateRowFromData(YourDataType data) { // 这里写原Operation4的实现逻辑 return new TBRow(...); }
注:请把YourAcLevelType等占位符替换成你实际的类型名称
2. 用LINQ重构循环逻辑
利用SelectMany展开嵌套集合,结合??运算符处理null的Details,避免空引用:
var rows = _inputData.TBFlat .SelectMany(rowData => rowData) .SelectMany(data => data.Details?.SelectMany(tLevel => tLevel.Details?.SelectMany(ruLevel => ruLevel.Details?.Select(CreateRowFromAcLevel) ?? new[] { CreateRowFromRuLevel(ruLevel) }) ?? new[] { CreateRowFromTLevel(tLevel) }) ?? new[] { CreateRowFromData(data) }) .ToList();
3. 可选:进一步优化可读性
如果觉得上面的LINQ链式调用偏紧凑,可以把每层的处理拆成独立方法,让逻辑更直观:
private IEnumerable<TBRow> ProcessRuLevel(YourRuLevelType ruLevel) { return ruLevel.Details != null ? ruLevel.Details.Select(CreateRowFromAcLevel) : new[] { CreateRowFromRuLevel(ruLevel) }; } private IEnumerable<TBRow> ProcessTLevel(YourTLevelType tLevel) { return tLevel.Details != null ? tLevel.Details.SelectMany(ProcessRuLevel) : new[] { CreateRowFromTLevel(tLevel) }; } private IEnumerable<TBRow> ProcessData(YourDataType data) { return data.Details != null ? data.Details.SelectMany(ProcessTLevel) : new[] { CreateRowFromData(data) }; } // 最终调用代码 var rows = _inputData.TBFlat .SelectMany(rowData => rowData) .SelectMany(ProcessData) .ToList();
重构后的代码完全保留了原有的分支逻辑,同时避免了多层嵌套的混乱,每个方法只负责单一层级的处理,后续维护和修改也更方便。
内容的提问来源于stack exchange,提问作者Ronak
相关产品推荐
相关产品推荐

