如何在嵌套循环中删除含非激活Action或无Action的Controllers?
最优实现方案:清理Permissions中的Controllers
需求回顾
- 删除包含至少一个
Active=false的Action的Controllers - 删除Action列表为空(或为null)的Controllers
推荐实现:LINQ链式查询(简洁高效)
利用LINQ的Where、Any、All方法可一行完成逻辑,代码可读性高且性能优异:
// 假设已有Permissions实例permission permission.controllers = permission.controllers .Where(ctrl => ctrl.actions != null && ctrl.actions.Any() && ctrl.actions.All(action => action.Active)) .ToList();
逻辑拆解
ctrl.actions != null:规避空引用异常,确保Action列表不为nullctrl.actions.Any():过滤掉Action列表为空的控制器(满足第二个需求)ctrl.actions.All(action => action.Active):仅保留所有Action都处于激活状态(Active=true)的控制器,自动排除包含无效Action的控制器(满足第一个需求)
备选实现:原地修改集合(RemoveAll)
如果需要直接修改原列表而非重新赋值,可使用List<T>.RemoveAll方法,同样高效:
// 直接在原列表中删除不符合条件的控制器 permission.controllers?.RemoveAll(ctrl => ctrl.actions == null || !ctrl.actions.Any() || ctrl.actions.Any(action => !action.Active));
对比嵌套循环的优势
- 代码简洁:无需多层嵌套循环,逻辑一目了然
- 避免异常:手动foreach循环中直接删除元素会触发
InvalidOperationException,LINQ或RemoveAll内部已处理集合修改的问题 - 性能优化:LINQ底层实现经过官方优化,性能不逊于手动编写的循环,复杂场景下表现更稳定
内容的提问来源于stack exchange,提问作者Yasim Yasin
相关产品推荐
相关产品推荐

