如何使用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
相关产品推荐
相关产品推荐

