C# 锯齿状数组:超出数组问题的范围

C# Jagged array: outside the bounds of the array issue

我有一个交错数组声明为:

char[][] m = new char[10][];

稍后填充。

System.Text.StringBuilder s = new System.Text.StringBuilder(c);
for (int x = 0; x < 10; x++)
    s.Append('=');

    for (int x = 0; x < 10; x++) m[x] = s.ToString().ToCharArray();

如果我执行以下操作,我会在第二个维度上出错:

Console.WriteLine(String.Format("width={0}", m.GetLength(0)));
Console.WriteLine(String.Format("height={0}", m.GetLength(1))); <---- ERROR HERE

有什么想法吗?

Array.GetLength(int dimension) 仅适用于 多维 数组。您的数组 'm' 是 不是 多维的,而是 锯齿状的

这意味着它是一个元素类型为 char[] 的数组。

所以你只有一维(长度 10)并且 GetLength(1) 抛出错误。

09,我可以得到 m[i].Length。但前提是你初始化了元素:

m[0] = new char[10];
int l = m[0].Length; // 10

您混淆了方形数组和锯齿状数组。锯齿状数组也称为数组数组,它​​看起来像这样:

char[][] a = new char[10][];

交错数组中的每个元素本身就是一个数组,它的长度可以与其他任何元素完全不同:

a[0] = new char[1];
a[1] = new char[100];
a[2] = new char[5];
...
a[9] = new char[999999];

如您所见,GetLength(1) 在锯齿状数组上毫无意义。它甚至 return 会是什么?要获得第二级数组的长度,您必须遍历它们并调用它们的各种 Length 属性:

for (int i = 0; i < a.Length; i++)
{
    int length = a[i].Length;
}

出于您的目的,您可能想改用方形阵列(也称为二维阵列):

char[,] a = new char[10,10];

与锯齿状数组不同,方形数组的第二维保证长度相同。这意味着 GetLength(1) 可以 return 一个有信心的值。