令人困惑的索引 - 超出界限

时间:2010-08-20 15:26:47

标签: c# matrix multidimensional-array

我的代码中有一节需要反转矩阵。这只能合理地在方形矩阵上完成,在这种情况下是3×3方阵。我用来反转矩阵的工具一直说我的阵列不是正确的方块。

所以我做了一点测试:

double[,] x = new double[3, 3];

MessageBox.Show(x.GetLength(0).ToString());
MessageBox.Show(x.GetLength(1).ToString());
MessageBox.Show(x.GetLength(2).ToString());

第一个出现为“3”。第二个出现为“3”。第三个出现IndexOutOfRangeException。我只是忽略了一些非常明显或者......这有点奇怪吗?

(注意:这是使用.Net 2.0的C#代码)

6 个答案:

答案 0 :(得分:11)

您只有一个包含两个维度的数组。为什么您会要求第三个维度的大小为您提供有效的结果?

Array.GetLength()方法返回Array指定维度中的元素数。在你的情况下:

x.GetLength(2).ToString();   // asking for size of third dimension

你问的是二维数组,它的第三维尺寸是多少。结果是IndexOutOfRangeException。这是预期的行为。

在您的代码示例中,看起来您可能会混淆每个声明尺寸的大小,并且维数。以下是不同尺寸的矩形阵列的一些示例:

var d1 = new int[5];     // one dimensional array, containing 5 elements
var d2 = new int[3,3];   // two-dimensional 3x3 element array
var d3 = new int[2,2,2]; // three-dimension array of 2x2x2 elements
var d4 = new int[2,5,6,8]; // four dimensional array, of 2x5x6x8 elements

看模式?维数由您在数组声明中指定的数量确定。每个维度的大小由声明中确定。

答案 1 :(得分:4)

您的矩阵只有2个维度,长度均为3个元素。第三行MessageBox试图打印不存在的第三维的长度。

答案 2 :(得分:3)

只是提供一个可视化的例子并用我自己的话语提供答案......(我最初看到为什么抛出异常也失败了):

double[,] x = new double[3, 3];给出一个如下所示的数组:

[0,0] [1,0] [2,0]
[0,1] [1,1] [2,1]
[0,2] [1,2] [2,2]

我认为代码试图找到可能被认为是子阵列的长度,其中每一行代表一个数组,而该数组又是一个更大数组的成员。

实际上,行本身不是数组,只是原始数组的成员(双精度数)。 GetLength方法正在寻找数组的维度而不是长度(这可能会让人感到困惑,因为Length用于确定数组中的成员数)。如果您愿意,此数组有两个维度,X维度和Y维度。

把它想象成一张有两个尺寸的平板。如果你添加第三个:

double[,,] x = new double[3, 3, 3];

工作表变为多维数据集,添加了新维Z,第三个GetLength将起作用。

答案 3 :(得分:1)

double[,,] x = new double[3, 3, 3];

MessageBox.Show(x.GetLength(0).ToString());
MessageBox.Show(x.GetLength(1).ToString());
MessageBox.Show(x.GetLength(2).ToString());

答案 4 :(得分:0)

您的阵列中没有定义3个维度,因此您只能获得两个维度。您的代码要求的是立方体的尺寸,而不是正方形。

double[,] x = new double[3,3] // This sets up a two-dimensional array

MessageBox.Show(x.GetLength(0).ToString()); //Shows the length of the X axis
MessageBox.Show(x.GetLength(1).ToString()); //Shows the length of the Y axis
MessageBox.Show(x.GetLength(2).ToString()); //Trys to show the length of Z Axis.

答案 5 :(得分:0)

这可以帮助您查看已解释的内容。

你声明它的x数组如下:

double[,] x = new double[3, 3];

Dimensions     0,1    0,1    0,1            
Element       [0,0], [0,1], [0,2]   
Element       [1,0], [1,1], [1,2]
Element       [2,0], [2,1], [2,2]
Lengths        3,3    3,3    3,3