使用While循环分配数组值将生成“数组边界之外的索引”

时间:2018-08-04 05:44:24

标签: c# arrays while-loop

好的,这是一个完全菜鸟问题。振作起来。

我正在尝试使用While循环将值分配给数组,并且我在数组错误消息的范围之外获取了Index。看起来是这样的:

int [] Counter = new int [46];

xCount = 0;
while (xCount != 47)
{
    Counter[xCount] = (xCount * 10000);
    xCount++;   
}

我应该使用不同的C#代码在数组中设置值吗? 预先感谢您的任何答案/见解!

2 个答案:

答案 0 :(得分:3)

var Counter = Enumerable.Range(0,47).Select(x=>x*10000).ToArray();

应为您提供47个元素的数组。它使用LINQ Enumerable.RangeSelectToArray方法。

但是,停下来,问问自己数组是否最适合使用(对于您要解决的任何问题)。现代的collection classes比数组更适合大多数问题。通常,除非您自己编写一个收集类或需要与较早的代码进行互操作,否则建议不要使用数组。

另外,请注意,上面的代码是 declarative 。我说的是我想要的,而不必担心如何完成的细节。在后台,可能是使用循环或其他某种机制来生成该范围。但我并不在乎,我只想从该范围开始,应用转换(通过select),然后将其强制为数组。我也不关心在中间阶段存储范围/计算的用途。

仍然存在适合使用循环的地方-但是编写while循环并递增计数器有点奇怪。遍历数组的标准习惯用法是for循环:

for(int i=0;i<Counter.Length;i++)
{
     Counter[i] = i*10000;
}

还要注意我如何使用数组的长度而不是硬编码一个数字。这样可以确保我们不会离开数组的末尾。 您的代码中的错误实际上与此有关。当您编写new int [46]时,您正在创建一个包含46个元素的数组。这意味着该数组的有效索引为0-45。您的循环尝试使用index 46,这是一个异常,它超出了数组的范围。

答案 1 :(得分:1)

简短的回答:C#中的索引从0开始,因此元素的数量将比数组的最后一个索引总是大1。!即:您有2个元素,索引分别为0和1。

您的情况:您使用46个元素初始化了数组,那么索引的范围是0-45。