如何在for循环外执行if判断来决定循环内调用函数传入数组元素还是单变量
解决方案
以下是几种无冗余判断的实现方案,均只在for循环外执行一次条件判断:
方案1:预定义取值委托(最通用,代码简洁)
提前在循环外定义参数获取委托,循环内直接调用即可,委托调用开销远低于重复判断的开销,绝大多数场景下优先使用。
示例代码:
// 此处ResizeParam替换为ForcedResize的实际元素类型,fixedResize替换为你的单变量名 Func<int, ResizeParam> getResizeParam; if (你的判断条件) { getResizeParam = i => ForcedResize[i]; } else { getResizeParam = i => fixedResize; } for (int i = 0; i < CurrentVerticalList.Count; i++) { GuiGeneral CGroup = CurrentVerticalList[i]; // 直接调用预定义的委托获取参数 CGroup.ResizeUsingStandard(getResizeParam(i)); for (int j = 0; j < 2; j++) { GlobalListIndex[j]++; } CGroup.MoveElementTo(CCoord, false); CCoord.y += CGroup.ElementRect.WidthHeight.y; }
方案2:公共逻辑抽离(极致性能无额外开销)
如果对性能要求极高,不想承担任何委托调用开销,可以将循环内的公共逻辑抽为独立方法,仅在外部判断后走不同的循环分支,无业务逻辑重复。
首先抽离公共处理逻辑:
// 注意参数传递规则,引用类型/值类型按实际需求调整修饰符 private void ProcessGroup(GuiGeneral group, ref Coord CCoord, int[] GlobalListIndex) { for (int j = 0; j < 2; j++) { GlobalListIndex[j]++; } group.MoveElementTo(CCoord, false); CCoord.y += group.ElementRect.WidthHeight.y; }
外部判断后执行对应逻辑:
if (你的判断条件) { for (int i = 0; i < CurrentVerticalList.Count; i++) { GuiGeneral CGroup = CurrentVerticalList[i]; CGroup.ResizeUsingStandard(ForcedResize[i]); ProcessGroup(CGroup, ref CCoord, GlobalListIndex); } } else { for (int i = 0; i < CurrentVerticalList.Count; i++) { GuiGeneral CGroup = CurrentVerticalList[i]; CGroup.ResizeUsingStandard(fixedResize); ProcessGroup(CGroup, ref CCoord, GlobalListIndex); } }
方案3:简化语法糖(C# 10及以上版本支持)
可以用三元表达式一行完成委托的赋值,进一步简化代码:
// 一行完成条件判断和取值逻辑绑定 var getResizeParam = 你的判断条件 ? (Func<int, ResizeParam>)(i => ForcedResize[i]) : i => fixedResize; // 循环内调用方式和方案1完全一致
注意事项
使用数组下标的场景建议在循环外提前校验ForcedResize.Length >= CurrentVerticalList.Count,避免运行时出现索引越界异常。
内容的提问来源于stack exchange,提问作者Mike64
相关产品推荐
相关产品推荐

