如何优化C#中通过方向键交换二维数组元素的实现?
首先,你的核心问题是重复处理每个方向键的坐标判断和交换逻辑,我们可以通过提取方向对应的坐标偏移量来统一处理,避免冗余代码。另外原代码的循环条件存在逻辑问题——isSorted是初始化时的检查结果,后续交换后不会更新,得每次循环都重新判断数组状态。
下面是优化后的完整代码:
private void SwapTiles(int[,] arr, int n) { int x = 0; int y = 0; do { ConsoleKeyInfo info = Console.ReadKey(); Console.WriteLine(); // 用switch表达式映射方向到坐标偏移量,一行处理所有方向 (int xOffset, int yOffset) = info.Key switch { ConsoleKey.RightArrow => (0, 1), ConsoleKey.LeftArrow => (0, -1), ConsoleKey.UpArrow => (-1, 0), ConsoleKey.DownArrow => (1, 0), _ => (0, 0) // 非方向键不处理 }; // 计算偏移后的新坐标 int newX = x + xOffset; int newY = y + yOffset; // 统一做边界检查,避免每个方向重复写判断 if (newX < 0 || newX >= n || newY < 0 || newY >= n) { continue; } // 用元组解构直接交换元素,省去临时变量temp (arr[x, y], arr[newX, newY]) = (arr[newX, newY], arr[x, y]); // 更新当前选中位置的坐标 x = newX; y = newY; } while (!ArrSorted(arr)); // 数组未排序时持续循环 }
关键优化点说明:
- 方向偏移统一处理:通过switch表达式将方向键与坐标偏移量绑定,避免为每个方向写重复的if判断逻辑
- 统一边界检查:一次判断覆盖所有方向的越界情况,减少冗余代码
- 简化交换操作:利用C#元组解构语法直接交换数组元素,省去传统的临时变量
- 修正循环逻辑:每次循环结束后重新检查数组是否排序,确保数组有序时停止循环
- 修复位置更新bug:原代码未更新x、y坐标,只会固定交换(0,0)和相邻元素,优化后会跟随方向键移动选中位置
如果你的项目使用低于C# 8.0的版本,可以把switch表达式替换为普通switch语句:
int xOffset = 0; int yOffset = 0; switch (info.Key) { case ConsoleKey.RightArrow: yOffset = 1; break; case ConsoleKey.LeftArrow: yOffset = -1; break; case ConsoleKey.UpArrow: xOffset = -1; break; case ConsoleKey.DownArrow: xOffset = 1; break; }
内容的提问来源于stack exchange,提问作者Darke
相关产品推荐
相关产品推荐

