如何优化这段遍历数组的代码以使其更简洁?
优化遍历数组生成位置的代码方案
嘿,我来帮你捋捋这段代码的优化思路!从你给出的代码片段来看,核心应该是生成敌人网格左右两侧的可生成位置数组对吧?原代码里有不少重复逻辑和可以简化的地方,咱们一步步来优化:
先明确核心问题
原代码的问题在于:
- 变量命名模糊(
coordX/coordY语义不清晰,而且看起来你只用到了coordY的左右方向) - 重复的循环逻辑(左右两个方向的循环几乎一致,只有x坐标不同)
- 冗余的条件判断(两次判断方向来执行不同的循环赋值)
优化方案1:用LINQ简化数组生成(推荐)
如果你的项目允许使用LINQ(Unity里默认支持,只需引入命名空间),可以用一行代码替代手动循环,同时去掉条件分支:
using System.Linq; // 记得引入这个命名空间 void GetSpawnablePosition() { // 直接绑定方向与对应的x坐标,避免后续条件判断 var sideSpawnSettings = new[] { (Direction: Vector2.left, SpawnX: 0), (Direction: Vector2.right, SpawnX: enemyGrid.grid.Length - 1) }; foreach (var setting in sideSpawnSettings) { // 用LINQ直接生成位置数组,替代手动for循环 var spawnPositions = Enumerable.Range(1, enemyGrid.grid[0].Length - 2) .Select(y => new Vector2(setting.SpawnX, y)) .ToArray(); // 这里添加你对spawnPositions的后续处理逻辑,比如原代码里的操作 } }
优化点说明
- 语义化命名:把模糊的
coordY改成sideSpawnSettings,同时用元组把方向和对应的x坐标绑定,逻辑一目了然 - 消除重复代码:左右方向的生成逻辑合并成一个循环,通过元组的不同参数区分
- LINQ简化数组生成:
Enumerable.Range生成y的取值范围,Select直接转换成Vector2,省去手动初始化数组和循环赋值的代码 - 去掉条件判断:不再需要判断方向,直接从元组取对应的x坐标,代码更简洁
优化方案2:不使用LINQ的简化版本
如果项目禁用LINQ或者你不想引入额外命名空间,可以用字典映射方向与x坐标,简化循环:
void GetSpawnablePosition() { // 用字典存储方向与对应x坐标的映射 var directionToX = new Dictionary<Vector2, int> { { Vector2.left, 0 }, { Vector2.right, enemyGrid.grid.Length - 1 } }; foreach (var directionPair in directionToX) { int xPos = directionPair.Value; int positionCount = enemyGrid.grid[0].Length - 2; Vector2[] spawnPositions = new Vector2[positionCount]; for (int j = 0; j < positionCount; j++) { spawnPositions[j] = new Vector2(xPos, j + 1); } // 后续处理逻辑 } }
额外小建议
如果coordX(上下方向数组)后续代码里用不到,建议直接删除,避免冗余变量,让代码更干净。
内容的提问来源于stack exchange,提问作者Crocsx
相关产品推荐
相关产品推荐

