【问题标题】:Why does my method continue past the length of the array?为什么我的方法会继续超过数组的长度?
【发布时间】:2018-07-30 04:53:48
【问题描述】:

我已经为此苦苦挣扎了几个小时,终于让这个方法几乎可以工作,除了它总是超过数组长度的 1 个条目。我该如何解决这个问题?

public static string FillContestArray(string[,] talentCodes)
    {
        int x = 0;
        int y = 0;
        for (x = 0; x < talentCodes.Length; x++)
        {
            for (y = 0; y < talentCodes.Length; y++)
            {
                Console.WriteLine("Enter contestant's name: ", x + 1);
                talentCodes[x,y] = Console.ReadLine();
                Console.WriteLine("Enter contestant's talent: ", y + 1);
                talentCodes[x,y] = Console.ReadLine();
            }
        }
        return talentCodes[x, y];
    }

编辑:人们要求更多细节。下面是其余的代码。我要做的是将数组参赛者传递给此方法 FillContestArray 以填充数组,然后从那里继续。用户决定阵列有多大,如果这完全相关的话。抱歉,缺少详细信息或适当的术语,我是新手。谢谢!

int userInput = 0;
        int thisYear, lastYear;

        Console.Write("Please enter the number of contestants entered in last year's competition: ");
        lastYear = EnterContestants(userInput);
        Console.Write("Please enter the number of contestants entered in this year's competition: ");
        thisYear = EnterContestants(userInput);

        ContestMessage(thisYear, thisYear);

        string[,] contestants = new string[thisYear,thisYear];

        FillContestArray(contestants);

        Console.ReadKey();
    }
    public static int EnterContestants(int entries)
    {
        int numbOC;
        string numbString;
        numbString = Console.ReadLine();
        numbOC = Convert.ToInt32(numbString);

        return numbOC;
    }

【问题讨论】:

  • 提示:数组的长度属性只适用于第一个维度。您应该使用排名。
  • 您的 x 和 y 在循环内递增。因此,在返回时,您超出了数组的限制
  • 您的代码还有其他问题,例如覆盖第二个读取行中的值。
  • 您能否详细解释一下代码试图实现的目标?如前所述,代码存在许多问题,如果我们不知道最终目标是什么,我们很难帮助您修复它。
  • @Trevor 我正在尝试使用此方法填充数组。抱歉缺少细节,我对编码很陌生,这是我第一次发帖

标签: c# arrays methods


【解决方案1】:

当你的 for 循环结束时,x 和 y 的最后一个值是talentCode.Length()。当 for 循环终止时,x 和 y 等于 talentCode.Length()。这是数组之后的 1 个元素,因为它从 0 计数到 talentCode.Length()-1。如果你现在return talentCode[x,y],你已经在数组后面使用了索引。

对了,看来你真的很想

return talentCode;

这将返回数组,而不是

return talentCode[x,y];

这是无效的(试图返回长度+1,长度+1项),相比

return talentCode[x-1,y-1];

它实际上会返回二维数组的最后一个元素(见上面的解释)

【讨论】:

    【解决方案2】:

    您应该使用二维数组长度 - 请参阅此问题以获取示例:How do you get the width and height of a multi-dimensional array?

    【讨论】:

    • 好的,我想我理解那里的想法,但是当我实施它时,我似乎遇到了同样的问题。所以我假设我仍然没有得到一些东西
    【解决方案3】:

    从更新后的代码中猜测您要实现的目标...

    当您使用string[,] contestants = new string[thisYear,thisYear]; 创建参赛者数组时,它会创建一个由thisYear 平方数元素组成的数组。

    例如,如果今年的比赛有 5 位参赛者,contestants 将包含 25 个元素

    contestants[0,0]
    contestants[0,1]
    contestants[0,2]
    contestants[0,3]
    contestants[0,4]
    contestants[1,0]
    contestants[1,1]
    ...
    contestants[4,4]
    

    如果我猜的话,我会想象你的实际意图是为每个参赛者制作一个包含两个元素的数组,一个是他们的名字,另一个是他们的天赋,例如:

    contestants[0,0] = "Alice"
    contestants[0,1] = "Dancing"
    contestants[1,0] = "Bob"
    contestants[1,1] = "Juggling"
    contestants[2,0] = "Carol"
    contestants[2,1] = "Hacking"
    contestants[3,0] = "Dan"
    contestants[3,1] = "Singing"
    ...
    

    这可以通过number of contestants by 2 创建一个二维数组来实现,例如:

    string[,] contestants = new string[thisYear, 2];
    

    然后这个数组会被传入你修改后的FillContestArray() 函数,以提示输入每个参赛者的姓名和才能,如下所示:

    public static void FillContestArray(string[,] talentCodes)
    {
        int x = 0;
        for (x = 0; x < talentCodes.GetLength(0); x++)
        {
            Console.WriteLine("Enter contestant's name: ", x + 1);
            talentCodes[x,0] = Console.ReadLine();
            Console.WriteLine("Enter contestant's talent: ", x + 1);
            talentCodes[x,1] = Console.ReadLine();
        }
    }
    

    请注意,函数的返回类型现在是void,这意味着该函数不需要返回值,它只填充给定的数组。

    希望对你有帮助

    【讨论】:

    • 是的!做到了!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多