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

如何使用LINQ优雅改写嵌套循环代码?

如何用LINQ更优雅地改写这段嵌套循环代码?

改写后的代码

// 预分组数据,减少重复查询,提升性能
var workflowsByWorkflowName = data.Item2
    .GroupBy(t => t.WorkFlowName)
    .ToDictionary(g => g.Key, g => g.ToList());

var permissionsByStatusName = data.Item4
    .GroupBy(p => p.StatusName)
    .ToDictionary(g => g.Key, g => g.Select(t => new LowestLeafClass
    {
        ShortName = t.ShortName,
        StatusName = t.StatusName,
        TransitionName = t.TransitionName
    }).ToList());

// 用LINQ直接构造结果对象
var result = new MostOuterClass
{
    MainClassItems = data.Item1.Select(item => new MainClass
    {
        Name = item.Name, // 原代码未赋值,根据类结构补充
        TabOneItems = workflowsByWorkflowName.TryGetValue(item.Name, out var workflows)
            ? workflows.Select(w => new TabOneClass
            {
                WorkFlowName = w.WorkFlowName,
                TransitionName = w.TransitionName,
                StatusName = w.StatusName, // 原代码未赋值,根据类结构补充
                Permissions = permissionsByStatusName.TryGetValue(w.StatusName, out var permissions)
                    ? permissions
                    : Enumerable.Empty<LowestLeafClass>()
            }).ToList()
            : new List<TabOneClass>()
    }).ToList()
};

关键优化点

  • 预分组提升性能:通过GroupBy+ToDictionary把关联数据提前分组,避免原代码中每次循环都执行Where查询,数据量越大性能提升越明显。
  • 用LINQ替代嵌套循环:用Select直接遍历并构造目标对象,把嵌套的foreach逻辑转化为声明式的LINQ语句,代码更简洁易读。
  • 空安全处理:使用TryGetValue处理无匹配项的场景,避免空引用异常,比直接使用字典索引器更稳妥。
  • 补全属性赋值:原代码未给MainClass.Name和TabOneClass.StatusName赋值,这里根据类定义补充,保证对象属性完整性(若业务不需要可自行移除)。

内容的提问来源于stack exchange,提问作者Bohn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:42:51