为什么这会导致“指数超出范围”异常?

时间:2012-01-22 02:40:33

标签: c# arrays exception

    public void button2_Click(object sender, EventArgs e)

    {
        char[] delimiters = { ',', '\r', '\n', ' ' };
        string[] content = File.ReadAllText(CSV_File).Split(delimiters);

        int bounds = (content.GetUpperBound(0)); //bounds of this content string is 96
        int i = 1;
        id = new string[(bounds / 4)]; //for example index size = 96 / 4 = 24

        for (i = 0; i <= (bounds / 4); i++)
        {
            int rows = (i * 4); // gets every 4th value
            id[i] = content[rows]; //inserts row 96 into id 24 - fails here
        }
    }

现在坚持了一段时间。确切的错误是“索引超出了数组的范围”。我不知道这指的是哪个指数。

5 个答案:

答案 0 :(得分:3)

将for循环中的<=更改为<

答案 1 :(得分:1)

这取决于您实际阅读的文件的内容。代码似乎很好。

答案 2 :(得分:1)

为了获得最佳编码实践,最好在for循环中检查id.Length,而不是检查bounds / 4

话虽如此,我相信您应该在for循环的条件语句中使用<而不是<=

答案 3 :(得分:1)

看起来你不小心写了&lt; =而不是&lt;。请记住,数组索引的长度为1。

我可能会建议稍微清理一下代码。这是很多额外的括号和变量...

var delimeters = new[] { ',', '\r', '\n', ' ' };
var content = File.ReadAllText(CSV_File).Split(delimeters);

id = content.Where((n, i) => i % 4 == 0).ToArray();

答案 4 :(得分:0)

我相信在最后一次迭代中你会得到异常,因为在最后一次迭代中你正在访问索引(bounds / 4),但索引的有效范围是0(bounds / 4 ) - 1。基本上,你要超越数组id的结尾。您需要在循环条件中将<=更改为<