C#交错数组

C# 中的交错数组其实就是元素为数组的数组,换句话说就是交错数组中的每个元素都可以是维度和大小不同的数组,所以有时交错数组也被称为“数组的数组”。

1、声明交错数组

交错数组的声明语法如下所示:

data_type[][] array_name;

假如要声明一个具有三个元素的一维交错数组,并且数组中的每个元素都是一个一维的整型数组,示例代码如下:

int[][] jaggedArray = new int[3][];

2、初始化交错数组

和普通数组相同,交错数组也需要初始化后才可以使用,可以使用下面的方式初始化一个交错数组。

int[][] jaggedArray = new int[3][]; // 定义一个交错数组
jaggedArray[0] = new int[5];        // 对数组的第一个元素初始化
jaggedArray[1] = new int[4];        // 对数组的第二个元素初始化
jaggedArray[2] = new int[2];        // 对数组的第三个元素初始化

上面的交错数组中包含三个元素,第一个元素是长度为 5 的整型数组,第二个元素是长度为 4 的整型数组,第三个元素是长度为 2 的整型数组。

除了上面的方法外,还可以直接使用具体的值来填充数组,这种情况下就不需要再设定数组的大小了,如下所示:

int[][] jaggedArray = new int[3][]; // 定义一个交错数组
jaggedArray[0] = new int[] {1, 2, 3, 4, 5};
jaggedArray[1] = new int[] {6, 7, 8, 9};
jaggedArray[2] = new int[] {10, 11};

还可以在声明数组时,直接将数组初始化,如下所示:

int[][] jaggedArray = new int[][]{
    new int[] {1, 2, 3, 4, 5},
    new int[] {6, 7, 8, 9},
    new int[] {10, 11}
};

上面的声明方式还有一种简写形式,如下所示:

int[][] jaggedArray = {
    new int[] {1, 2, 3, 4, 5},
    new int[] {6, 7, 8, 9},
    new int[] {10, 11}
};

注意:不能从元素初始化中省略 new 运算符,因为不存在元素的默认初始化。

3、访问数组中的元素

以上面定义的交错数组 jaggedArray 为例,可以使用如下所示的方法来获取数组的中每个元素或者为指定的元素赋值:

int a = jaggedArray[0][1]    // 变量 a 的值为:2
jaggedArray[2][1] = 0         // 将交错数组中第三个数组元素中的第二个元素赋值为 0

4、交错数组和多维数组

交错数组中的元素不仅可以是一维数组,还可以是多维数组,例如下面的代码中定义了一个包含三个二维数组元素的一维交错数组:

int[][,] jaggedArray = new int[3][,]
{
    new int[,] {
        {1, 1},
        {2, 3}
    },
    new int[,] {
        {5, 8},
        {13, 21},
        {34, 55}
    },
    new int[,] {
        {89, 144},
        {233, 377},
        {610, 987}
    }
};

对于这样的交错数组,在访问数组中的每个元素时也需要做出相应的改变,如下所示:

int a = jaggedArray[1][1,1]     // 变量 a 的值为 21
int b = jaggedArray[2][0,0]     // 变量 b 的值为 89

【示例】定义一个交错数组,并遍历数组中的内容:
using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args){
            int[][] arr = new int[3][]{  
                new int[]{31, 22, 16, 88},
                new int[]{21, 54, 6, 77, 98, 52},
                new int[]{112, 25}
            };
            // 遍历数组
            for(int i = 0; i < arr.Length; i++){
                for(int j = 0; j < arr[i].Length; j++){
                    Console.Write(arr[i][j]+" ");
                }
                Console.WriteLine();
            }
            Console.ReadLine();
        }
    }
}
运行结果如下:

31 22 16 88
21 54 6 77 98 52
112 25

提示:示例中用到了 Length 属性,它是数组的一个属性,代表数组的长度(元素个数)。

【示例】使用交错数组记录学生不同学科的成绩:
using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args){
            string[] names = {"小明","小红","小强"};
            string[] course = {"语文","数学","英语"};
            int[][] achievement = {
                new int[]{98, 85, 90},
                new int[]{91, 95, 93},
                new int[]{88, 89, 97},
            };

            for(int i = 0; i < names.Length; i++){
                string str = "";
                for(int j = 0; j < achievement[i].Length; j++){
                    str += course[j] + " " + achievement[i][j] + ",";
                }
                Console.WriteLine("{0}的成绩为:{1}", names[i], str);
            }
            Console.ReadLine();
        }
    }
}
运行结果如下:

小明的成绩为:语文 98,数学 85,英语 90,
小红的成绩为:语文 91,数学 95,英语 93,
小强的成绩为:语文 88,数学 89,英语 97,