C# 数组的数组
多维数组可称为矩形数组,这是因为每一行的元素个数都相同。任何一个 x坐标都有一个对应0至3的y坐标。
也可以使用锯齿数组Gagged array),其中每行的元素个数可能不同。为此,需要有这样一个数组,其中的每个元素都是另一个数组。也可以有数组的数组的数组,甚至更复杂的数组。但是,注意这些数组都必须有相同的基本类型。
声明数组的数组时,其语法要求在数组的声明中指定多个方括号对,例如:
int[][] jaggedlntArray;
但初始化这样的数组不像初始化多维数组那样简单,例如,不能采用以下声明方式:
jaggedlntArray = new int[3][4];
即使可以这样做,也不是很有效,因为使用简单的多维数组可以较为轻松地取得相同的结果。也不能使用下面的代码:
jaggedlntArray ={{1,2,3}, {1}, {1,2}};
有两种方式:可以初始化包含其他数组的数组(为清晰起见,称其为子数组),然后依次初始化子数组。
jaggedlntArray = new int[2][];
jaggedlntArray[0] = new int[3];
jaggedlntArray[1] = new int[4];
也可以使用上述字面值赋值的一种改进形式:
jaggedlntArray = new int[3][] { new int [] { 1, 2, 3 }, new int[] { 1 },
new int[] { 1, 2 } };
也可以进行简化,把数组的初始化和声明放在同一行上,如下所示:
int[][] jaggedlntArray = { new int[] { 1, 2, 3 }, new int[] { 1 },
new int[] { 1,2 } };
可对锯齿数组使用foreach循环,但通常需要使用嵌套的foreach循环才能得到实际数据。例如,假定下述锯齿数组包含10个数组,每个数组又包含一个整数数组,其元素是1〜10的约数:
int[][] divisorslTo10 = {new int[] { 1 },
new int[] { 1, 2 },
new int[] { 1, 3 },
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 (int divisor in divisorslTo10)
{
WriteLine(divisor);
}
这是因为数组divisorelTolO包含的是int[]元素而不是int元素。正确的做法是循环遍历每个子数组和数组本身:
foreach (int[] divisorsOfInt in divisorslTolO)
{
foreach(int divisor in divisorsOfInt)
{
WriteLine(divisor);
}
}
可以看出,使用锯齿数组的语法要复杂得多!大多数情况下,使用矩形数组比较简单,这是一种比较简单的存储方式。但是,有时必须使用锯齿数组,所以知道如何使用它们是没有坏处的。一个例子是,使用XML文档时,其中一些元素有子元素,而一些元素没有。
点击加载更多评论>>