3

我这样做:

string[,] string1 = {{"one", "0"},{"Two", "5"},{"Three","1"}};
int b = 0;

for(int i = 0; i <= string1.Length; i++)
{
     b = int.Parse(string1[i, 1]); // Error occurs here
}

我收到一个错误,说“索引范围是数组的限制”(或类似的东西,错误是丹麦语)。

4

7 回答 7

8

有两个问题:

  • string1.Length将返回 6,因为这是数组的长度
  • <=用于比较,因此它实际上会尝试迭代 7 次。

你的for循环应该是:

for (int i = 0; i < string1.GetLength(0); i++)

对此处的调用GetLength(0)将返回 3,作为“第一个”维度的大小。返回 2的调用GetLength(1),因为第二个维度的大小为 2。(不过,您不需要这样做,因为您基本上是在硬编码您想要每个“行”的第二个“列”的知识。)

有关更多详细信息,请参阅文档Array.GetLength()

于 2012-08-29T12:54:51.043 回答
7

您的数组边界在循环中不正确:

for(int i = 0; i <= string1.Length; i++) 

应该读:

for(int i = 0; i < string1.GetLength(0); i++) 

有两件事是错误的:<=vs<意味着您将一个项目走得太远,并.Length返回数组的总长度 (6),而GetLength(0)后者返回第一个维度的长度 (3)。

于 2012-08-29T12:51:17.313 回答
2

您已经有了正确的答案,我会更新我的答案以更正它。正确的迭代应该是

        for (int i = 0; i < string1.GetLength(0); i++)
        {
            b = int.Parse(string1[i, 1]);
        }

因为i代表第一个维度的长度,而fixed1会返回数字,也就是第二个元素。

我很抱歉我首先给出的错误答案。

于 2012-08-29T12:50:56.163 回答
0

改成

for(int i = 0; i <= string1.GetLength(0); i++) 
{ 
b = Int32.Parse(string1[i][0]);
}

您的代码引用索引 1 而不是 0 导致异常称为Array out of bound

于 2012-08-29T12:51:14.180 回答
0

更改i <= string1.Lengthi < string1.Length

于 2012-08-29T12:51:51.837 回答
0

试试这个:

for(int i = 0; i < string1.GetLength(0) ; i++)
{
     b = int.parse(string1[i, 0]); // Error occurs here
}

Array.GetLength 方法

获取一个 32 位整数,该整数表示 Array 的指定维度中的元素数。

于 2012-08-29T12:52:45.073 回答
0

另外值得一提的是,int.Parse可能会抛出一个FormatException,考虑一下int.TryParse

于 2012-08-29T13:36:18.907 回答