【问题标题】:C# Jagged array: outside the bounds of the array issueC# 锯齿状数组:超出数组范围的问题
【发布时间】:2017-02-23 14:15:53
【问题描述】:

我有一个锯齿状数组声明为:

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

有什么想法吗?

【问题讨论】:

  • 这是一个锯齿状数组,而不是一个方形数组(您使用char[,] maz 声明)。每个子数组将有不同的长度。你检查maz[index].Length
  • 不要使用GetLenght(),而是使用Length 的第一个数组的单个项目。

标签: c# jagged-arrays


【解决方案1】:

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

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;
}

出于您的目的,您可能希望使用方形数组(也称为二维数组):

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

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

【讨论】:

    【解决方案2】:

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

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

    所以你只有一维(长度为10),GetLength(1) 会抛出错误。

    您可以从09 获得m[i].Length for i。但前提是你初始化了元素:

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

    【讨论】:

    • 从技术上讲,您可以GetLength 用于任何类型的数组。如果您尝试查询不存在的维度,它只会抛出异常,并且对于每个非多维数组,唯一存在的维度是0。 (还有一个事实是,实际上没有理由在非多维数组上使用GetLength,因为Length 更快更方便。)
    猜你喜欢
    • 2014-12-27
    • 1970-01-01
    • 2017-05-06
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    相关资源
    最近更新 更多