为什么我的方法继续超过数组的长度?

时间:2018-02-19 22:05:33

标签: c# arrays methods

我一直在努力解决这个问题几个小时了,我终于得到了这个方法几乎可以工作,除了它总是超过数组长度的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;
    }

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

顺便说一下,你似乎真的想要

return talentCode[x,y];

将返回数组,而不是

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

相比,

无效(尝试返回长度+ 1,长度+ 1条目)

{{1}}

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

答案 2 :(得分:1)

从更新的代码中猜测一下你想要实现的目标......

使用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创建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,这意味着函数不需要返回值,它只填充给定的数组。

希望这有帮助