You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:50:50