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

C#程序显示System.String[]而非目标字符串问题求助

问题分析与修复方案

嘿,我来帮你找出问题所在并搞定它!你遇到的System.String[]输出和角色选择错误,主要是几个常见的初学者小问题,咱们一个个说:

为什么会显示System.String[]?

当你用Console.WriteLine()直接输出一个数组时,C#默认只会打印这个数组的类型名称,而不是数组里的元素内容。你的StreetFighterSelection方法返回的是string[]类型,所以控制台就直接显示了System.String[],而不是你想要的角色名字。

代码里的核心错误点

咱们挨个捋你代码里的问题:

1. 返回值类型完全不符合需求

你想要的是执行完所有操作后单个选中的角色字符串,但你的方法返回了一个string[]数组,而且这个数组只在初始化的时候存了初始位置的角色(也就是Ryu),整个循环过程中完全没更新过这个数组——不管你怎么移动,返回的都是一开始的那个初始值。

2. 循环逻辑埋了大坑(else i++;)

你的for循环里有个致命错误:当当前操作不是"left"时,会执行else i++;,再加上for循环本身自带的i++,这会导致你跳过一半的移动操作!比如第一个操作是"up",执行完后i会变成1(for的i++)+1(else里的i++)=2,直接跳过第二个"left"操作,完全不符合你的预期。

3. 左右移动的边界判断全错了

你用fighters.GetLength(position[0])来获取每行的角色数量是错的——GetLength()是给多维数组用的方法,而你定义的fighters是交错数组(简单说就是数组套数组),要获取当前行的元素个数,应该用fighters[position[0]].Length。

另外,左右移动的边界逻辑也不对:

  • 向右移动时,应该判断是不是到了当前行的最后一个索引(比如第0行最后一个索引是5,因为有6个角色),也就是position[1] == fighters[position[0]].Length - 1,这时才重置为0;否则加1。你之前的判断条件永远不会触发,甚至会导致索引越界报错。
  • 向左移动时,当position[1] == 0,应该重置为当前行的最后一个索引(比如5),而不是fighters.GetLength(position[0])(这会得到6,超出索引范围,直接报错)。

4. 上下移动的逻辑可以更简洁(可选优化)

你当前的上下移动逻辑是对的(不能移出角色列表的两行),但可以简化成更直观的写法,比如用Math.Max或者直接判断边界。

修复后的完整代码

我把代码改成了更简洁易懂的版本,用foreach代替for循环避免索引错误,同时修正了所有逻辑问题:

static void Main(string[] args) {
    string[][] fighters = new string[][] {
        new string[] { "Ryu", "E.Honda", "Blanka", "Guile", "Balrog", "Vega" },
        new string[] { "Ken", "Chun Li", "Zangief", "Dhalsim", "Sagat", "M.Bison" }
    };
    string[] moves = new string[] {"up", "left", "right", "left", "left"};
    int[] position = new int[] {0, 0};
    // 现在方法返回单个字符串,直接打印就能看到角色名字啦
    Console.WriteLine(StreetFighterSelection(fighters, position, moves));
    Console.ReadLine();
}

// 修改返回值为string,因为我们只需要最终选中的角色
static string StreetFighterSelection(string[][] fighters, int[] position, string[] moves) {
    foreach (string move in moves) {
        switch (move) {
            case "up":
                // 已经在第0行了,不能再往上
                if (position[0] > 0) {
                    position[0]--;
                }
                break;
            case "down":
                // 已经在最后一行了,不能再往下
                if (position[0] < fighters.Length - 1) {
                    position[0]++;
                }
                break;
            case "right":
                position[1]++;
                // 超出当前行的最后一个索引时,重置到开头
                if (position[1] >= fighters[position[0]].Length) {
                    position[1] = 0;
                }
                break;
            case "left":
                position[1]--;
                // 小于0时,重置到当前行的末尾
                if (position[1] < 0) {
                    position[1] = fighters[position[0]].Length - 1;
                }
                break;
        }
    }
    // 返回最终位置对应的角色
    return fighters[position[0]][position[1]];
}

测试结果

用你提供的moves数组{"up", "left", "right", "left", "left"},初始位置是(0,0)(Ryu):

  1. "up":当前在第0行,无变化
  2. "left":从索引0跳到5,选中Vega
  3. "right":从5跳回0,回到Ryu
  4. "left":从0跳到5,选中Vega
  5. "left":从5跳到4,选中Balrog

最终控制台会输出Balrog,完全符合你的预期!

内容的提问来源于stack exchange,提问作者Sopterean Calin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:11:04