目 录CONTENT

文章目录

CSharp(十五) 多维数组

CSharp(十五) 多维数组

C# 中的多维数组(Multi-dimensional Arrays)是一种用于存储多个数据的数组,每个数据可以是不同的类型。

定义

多维数组是指具有两个或更多维度的数组。在 C# 中,多维数组分为矩形数组(Rectangular Array)和交错数组(Jagged Array)。本文只讨论矩形多维数组

声明语法

// 二维数组
dataType[,] arrayName;

// 三维数组
dataType[,,] arrayName;

// n维数组
dataType[d1,d2,...,dn] arrayName;

创建与初始化

// 1. 声明后使用 new 创建
int[,] matrix = new int[3, 4];  // 3行4列的二维数组,元素默认值为0

// 2. 声明时直接初始化
int[,] matrix2 = new int[,] {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

// 3. 简写形式(省略 new 和类型)
int[,] matrix3 = {
    {1, 2, 3},
    {4, 5, 6}
};

// 4. 三维数组示例
int[,,] cube = new int[2, 3, 4];
int[,,] cube2 = new int[,,] {
    {
        {1, 2},
        {3, 4}
    },
    {
        {5, 6},
        {7, 8}
    }
};

使用

访问元素

int[,] matrix = {
    {1, 2, 3},
    {4, 5, 6}
};

// 访问元素:使用逗号分隔的索引
int value = matrix[0, 1];  // 获取第0行第1列的值:2
matrix[1, 2] = 10;         // 设置第1行第2列的值为10

获取数组维度信息

int[,] matrix = new int[3, 4];

// 获取维度数(秩)
int rank = matrix.Rank;        // 结果:2

// 获取指定维度的长度
int rows = matrix.GetLength(0);    // 第0维长度:3
int cols = matrix.GetLength(1);    // 第1维长度:4

// 获取总元素数
int total = matrix.Length;         // 结果:12

// 获取指定维度的上界/下界
int upperBound0 = matrix.GetUpperBound(0);  // 第0维上界:2
int lowerBound0 = matrix.GetLowerBound(0);  // 第0维下界:0

遍历多维数组

int[,] matrix = {
    {1, 2, 3},
    {4, 5, 6}
};

// 方法1:使用嵌套 for 循环(推荐)
for (int i = 0; i < matrix.GetLength(0); i++)
{
    for (int j = 0; j < matrix.GetLength(1); j++)
    {
        Console.Write($"{matrix[i, j]} ");
    }
    Console.WriteLine();
}

// 方法2:使用 foreach(按行优先顺序遍历)
foreach (int item in matrix)
{
    Console.Write($"{item} ");
}
// 输出:1 2 3 4 5 6

多维数组作为方法参数

// 接收二维数组
void PrintMatrix(int[,] matrix)
{
    for (int i = 0; i < matrix.GetLength(0); i++)
    {
        for (int j = 0; j < matrix.GetLength(1); j++)
        {
            Console.Write($"{matrix[i, j]} ");
        }
        Console.WriteLine();
    }
}

// 返回二维数组
int[,] CreateIdentityMatrix(int size)
{
    int[,] matrix = new int[size, size];
    for (int i = 0; i < size; i++)
    {
        matrix[i, i] = 1;
    }
    return matrix;
}

注意事项

1. 矩形数组 vs 交错数组

特性 矩形数组 int[,] 交错数组 int[][]
内存布局 连续内存块 数组的数组(不连续)
每行长度 必须相同 可以不同
声明方式 int[,] int[][]
初始化 new int[3,4] new int[3][]
性能 访问更快(缓存友好) 灵活性更高
// 矩形数组:3行4列,每行长度固定
int[,] rectangular = new int[3, 4];

// 交错数组:3行,每行长度可不同
int[][] jagged = new int[3][];
jagged[0] = new int[4];
jagged[1] = new int[2];  // 第2行只有2个元素
jagged[2] = new int[5];  // 第3行有5个元素

2. 索引从 0 开始

C# 数组所有维度的索引都从 0 开始:

int[,] arr = new int[3, 4];
// 有效索引范围:
// 第0维:0, 1, 2
// 第1维:0, 1, 2, 3
// arr[3, 0] 会抛出 IndexOutOfRangeException

3. 初始化时必须指定所有维度大小

// 正确
int[,] a = new int[3, 4];

// 错误:不能省略维度大小
// int[,] b = new int[,];     // 编译错误
// int[,] c = new int[3,];    // 编译错误

4. 初始化器必须保持矩形结构

// 正确:每行元素数量相同
int[,] a = {
    {1, 2, 3},
    {4, 5, 6}
};

// 错误:每行元素数量不同会导致编译错误
// int[,] b = {
//     {1, 2},
//     {3, 4, 5}  // 错误!
// };

5. 多维数组是引用类型

int[,] a = {{1, 2}, {3, 4}};
int[,] b = a;  // b 引用同一个数组对象
b[0, 0] = 100;
Console.WriteLine(a[0, 0]);  // 输出:100

// 如果需要复制,必须手动创建新数组
int[,] c = new int[2, 2];
Array.Copy(a, c, a.Length);

6. 不能改变数组维度大小

数组创建后,各维度的大小是固定的:

int[,] arr = new int[3, 4];
// 无法直接调整大小,需要创建新数组
int[,] newArr = new int[5, 6];
Array.Copy(arr, newArr, arr.Length);
arr = newArr;  // 重新引用

7. 性能考虑

  • 矩形数组在内存中是连续存储的,访问效率高
  • 遍历时按行优先顺序(最右维度变化最快)效率最高
  • 大数组考虑使用 Array.Clear 而不是循环清零
int[,] largeArray = new int[1000, 1000];
// 高效清零
Array.Clear(largeArray, 0, largeArray.Length);

8. 与 Array 类的关系

多维数组继承自 System.Array,可以使用数组的通用方法:

int[,] arr = {{1, 2}, {3, 4}};

// 使用 Array 类的方法
Array.Reverse(arr);              // 反转(对多维数组效果有限)
int index = Array.IndexOf(arr, 3);  // 查找元素索引(按行优先展开)
Array.Sort(arr);               // 排序(对多维数组效果有限)

总结

多维数组(矩形数组)适合表示表格、矩阵、图像像素等固定大小的多维数据。其特点是:

  • 使用逗号 , 分隔维度声明和索引访问
  • 内存连续,访问效率高
  • 各维度大小固定,结构严格矩形
  • 索引从 0 开始
  • 是引用类型,赋值操作复制引用而非数据
0
博主关闭了当前页面的评论