多维数组 #
一、多维数组概述 #
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