C#Jagged数组:在数组问题的范围之外

时间:2017-02-23 14:15:54

标签: c# jagged-arrays

我有一个声称为:

的锯齿状数组
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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您正在混淆方阵和锯齿状阵列。锯齿状数组也称为数组数组,如下所示:

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)在锯齿状阵列上毫无意义。什么会回来?要获得第二级数组的长度,您必须遍历它们并调用它们的各种Length属性:

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

出于您的目的,您可能希望使用方阵(也称为2D阵列):

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

与锯齿状数组不同,方形数组的第二维保证长度相同。这意味着GetLength(1)可以放心地返回值。

答案 1 :(得分:1)

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

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

因此,您只有一个维度(长度为10)且GetLength(1)会引发错误。

您可以从m[i].Length0获取9 i。但只有初始化元素:

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