You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:10:09