多维数组 #

一、多维数组概述 #

C#支持两种类型的多维数组:

类型 说明 特点
矩形数组 每行长度相同 连续内存存储
交错数组 每行长度可不同 数组的数组

二、矩形数组 #

2.1 声明 #

csharp
int[,] twoD;
int[,,] threeD;

2.2 初始化 #

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

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

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

2.3 访问元素 #

csharp
int[,] matrix = 
{
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
    { 9, 10, 11, 12 }
};

int value = matrix[0, 0];
int center = matrix[1, 2];

matrix[0, 0] = 100;
matrix[2, 3] = 200;

2.4 获取维度信息 #

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

int rank = matrix.Rank;
int rows = matrix.GetLength(0);
int cols = matrix.GetLength(1);
int total = matrix.Length;

2.5 遍历矩形数组 #

csharp
int[,] matrix = 
{
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};

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

foreach (int value in matrix)
{
    Console.WriteLine(value);
}

2.6 三维数组 #

csharp
int[,,] cube = new int[2, 3, 4];

int[,,] cube = 
{
    { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } },
    { { 13, 14, 15, 16 }, { 17, 18, 19, 20 }, { 21, 22, 23, 24 } }
};

for (int i = 0; i < cube.GetLength(0); i++)
{
    for (int j = 0; j < cube.GetLength(1); j++)
    {
        for (int k = 0; k < cube.GetLength(2); k++)
        {
            Console.Write($"{cube[i, j, k]} ");
        }
        Console.WriteLine();
    }
    Console.WriteLine();
}

三、交错数组 #

3.1 声明 #

csharp
int[][] jagged;
int[][][] jagged3D;

3.2 初始化 #

csharp
int[][] jagged = new int[3][];

jagged[0] = new int[4] { 1, 2, 3, 4 };
jagged[1] = new int[2] { 5, 6 };
jagged[2] = new int[3] { 7, 8, 9 };

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

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

3.3 访问元素 #

csharp
int[][] jagged = 
{
    new[] { 1, 2, 3, 4 },
    new[] { 5, 6 },
    new[] { 7, 8, 9 }
};

int value = jagged[0][1];
int last = jagged[2][2];

jagged[0][0] = 100;

3.4 遍历交错数组 #

csharp
int[][] jagged = 
{
    new[] { 1, 2, 3, 4 },
    new[] { 5, 6 },
    new[] { 7, 8, 9 }
};

for (int i = 0; i < jagged.Length; i++)
{
    for (int j = 0; j < jagged[i].Length; j++)
    {
        Console.Write($"{jagged[i][j]} ");
    }
    Console.WriteLine();
}

foreach (int[] row in jagged)
{
    foreach (int value in row)
    {
        Console.Write($"{value} ");
    }
    Console.WriteLine();
}

四、矩形数组 vs 交错数组 #

4.1 内存布局 #

矩形数组:

text
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
连续内存块

交错数组:

text
[引用1] → [1, 2, 3, 4]
[引用2] → [5, 6]
[引用3] → [7, 8, 9]
多个独立数组

4.2 性能比较 #

csharp
int[,] rect = new int[1000, 1000];
int[][] jagged = new int[1000][];

for (int i = 0; i < 1000; i++)
    jagged[i] = new int[1000];

var sw = Stopwatch.StartNew();

for (int i = 0; i < 1000; i++)
    for (int j = 0; j < 1000; j++)
        rect[i, j] = i + j;

sw.Stop();
Console.WriteLine($"矩形数组:{sw.ElapsedMilliseconds}ms");

sw.Restart();

for (int i = 0; i < 1000; i++)
    for (int j = 0; j < 1000; j++)
        jagged[i][j] = i + j;

sw.Stop();
Console.WriteLine($"交错数组:{sw.ElapsedMilliseconds}ms");

4.3 使用场景 #

场景 推荐
每行长度相同 矩形数组
每行长度不同 交错数组
需要单独操作行 交错数组
数学矩阵运算 矩形数组

五、实战示例 #

5.1 矩阵运算 #

csharp
public static int[,] Add(int[,] a, int[,] b)
{
    int rows = a.GetLength(0);
    int cols = a.GetLength(1);
    
    var result = new int[rows, cols];
    
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            result[i, j] = a[i, j] + b[i, j];
        }
    }
    
    return result;
}

public static int[,] Multiply(int[,] a, int[,] b)
{
    int rowsA = a.GetLength(0);
    int colsA = a.GetLength(1);
    int colsB = b.GetLength(1);
    
    var result = new int[rowsA, colsB];
    
    for (int i = 0; i < rowsA; i++)
    {
        for (int j = 0; j < colsB; j++)
        {
            int sum = 0;
            for (int k = 0; k < colsA; k++)
            {
                sum += a[i, k] * b[k, j];
            }
            result[i, j] = sum;
        }
    }
    
    return result;
}

5.2 矩阵转置 #

csharp
public static int[,] Transpose(int[,] matrix)
{
    int rows = matrix.GetLength(0);
    int cols = matrix.GetLength(1);
    
    var result = new int[cols, rows];
    
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            result[j, i] = matrix[i, j];
        }
    }
    
    return result;
}

5.3 杨辉三角 #

csharp
public static int[][] GeneratePascalTriangle(int rows)
{
    var triangle = new int[rows][];
    
    for (int i = 0; i < rows; i++)
    {
        triangle[i] = new int[i + 1];
        triangle[i][0] = 1;
        triangle[i][i] = 1;
        
        for (int j = 1; j < i; j++)
        {
            triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
        }
    }
    
    return triangle;
}

5.4 棋盘表示 #

csharp
public class ChessBoard
{
    private readonly int[,] _board = new int[8, 8];
    
    public void SetPiece(int row, int col, int piece)
    {
        if (row >= 0 && row < 8 && col >= 0 && col < 8)
        {
            _board[row, col] = piece;
        }
    }
    
    public int GetPiece(int row, int col)
    {
        if (row >= 0 && row < 8 && col >= 0 && col < 8)
        {
            return _board[row, col];
        }
        return -1;
    }
    
    public void Print()
    {
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                Console.Write($"{_board[i, j],2} ");
            }
            Console.WriteLine();
        }
    }
}

六、总结 #

多维数组要点:

类型 声明 访问
二维数组 int[,] arr[i, j]
三维数组 int[,] arr[i, j, k]
交错数组 int[][] arr[i][j]

下一步,让我们学习数组操作!

最后更新:2026-03-26