C#中的锯齿数组(jagged array),其中每行的元素个数可能不同,所以每个元素都是另一个数组。也可以有数组的数组的数组,甚至更复杂的数组。但是这些数组都必须有相同的基本类型。
声明数组的数组时,其语法要求在数组的声明中指定多个方括号对:
int[][] jaggedIntArray;int[][][] jaggedIntArray;
锯齿数组的初始化不像多维数组那样简单,锯齿数组的初始化有两种方式:
1、可以初始化包含其他数组的数组,然后依次初始化子数组:jaggedIntArray = new int[2][];
jaggedIntArray[0] = new int[3];
jaggedIntArray[1] = new int[4];2、字面赋值的形式:jaggedIntArray = new int[3][] { new int[] { 1, 2, 3 }, new int[] { 1 }, new int[] { 1, 2 } };3、把数组的初始化和声明放在同一行上:int[][] jaggedIntArray = new int[3][] { new int[] { 1, 2, 3 }, new int[] { 1 }, new int[] { 1, 2 } };
可以对锯齿数组使用foreach循环,但通常需要使用嵌套的foreach循环才能得到实际数据。例如,下述锯齿数组包含10个数组,每个数组又包含一个整数数组:
int[][] divisors1To10 =
{
new int[] {1},
new int[] {1,2},
new int[] {1,2},
new int[] {1,2,4},
new int[] {1,5},
new int[] {1,2,3,6},
new int[] {1,7},
new int[] {1,2,4,8},
new int[] {1,3,9},
new int[] {1,2,5,10}
};
如果像下面这样使用foreach语句则会失败:
foreach (int divisor in divisors1To10)
{
Console.Writeline(divisor);
}
这是因为数组divisors1To10包含int[]元素,而不是int元素。正确的做法是循环遍历每个子数组和数组本身:
foreach (int[] divisorsOfInt in divisors1To10)
{
foreach (int divisor in divisorsOfInt)
{
Console.WriteLine(divisor);
}
}