本單元掌握陣列 **唯讀屬性 Length**、**foreach 唯讀遍歷**,並深度對比 **矩形陣列** 與 **交錯陣列** 的記憶體佈局、宣告語法與遍歷差異。
int[] arr = new int[10];
Console.WriteLine(arr.Length); // 10
int[,] matrix = new int[3,4];
Console.WriteLine(matrix.Length); // 12 (3*4,所有維度總和)
Console.WriteLine(matrix.GetLength(0)); // 3 (第 0 維/列數)
Console.WriteLine(matrix.GetLength(1)); // 4 (第 1 維/行數)
⚠️ 多維陣列 Length 回傳**所有維度元素總數**,單一維度長度請用 GetLength(dimension)。
int[,,] cube = new int[2,2,2] { {{1,2},{3,4}}, {{5,6},{7,8}} };
// 傳統 for 需 3 層迴圈
for (int i=0;i<2;i++)
for (int j=0;j<2;j++)
for (int k=0;k<2;k++)
Console.WriteLine(cube[i,j,k]);
// foreach 一行搞定(按儲存順序線性輸出 1~8)
foreach (int val in cube) Console.WriteLine(val);
限制:foreach 迭代變數為 **唯讀**,無法修改陣列元素;需修改請用 for 索引存取。
Console.Write("學生人數:"); int n = int.Parse(Console.ReadLine());
string[] names = new string[n];
for (int i = 0; i < names.Length; i++)
{
Console.Write($"第 {i+1} 位姓名:");
names[i] = Console.ReadLine();
}
Console.WriteLine("\n--- 名單 ---");
foreach (string name in names) Console.WriteLine(name);
| 特性 | 矩形陣列 int[,] | 交錯陣列 int[][] |
|---|---|---|
| 記憶體佈局 | 單一連續區塊 | 陣列的陣列,各行獨立配置 |
| 行長度 | 固定,所有行相同 | 每行可不同 |
| 宣告語法 | new int[3,4] | new int[3][] 再逐行 new int[N] |
| 索引語法 | arr[r,c] | arr[row][col] |
| Length 含義 | 總元素數 | 外層陣列長度(行數) |
| 適用場景 | 矩陣運算、固定寬表格 | 不規則資料、節省稀疏空間 |
// 1. 分步:先定行數,再逐行定列數
var jagged = new int[4][];
jagged[0] = new int[6];
jagged[1] = new int[2];
jagged[2] = new int[3];
jagged[3] = new int[5];
// 2. 逐行直接賦值
var jagged2 = new int[4][];
jagged2[0] = new int[] {1,3,5,7,9,13};
jagged2[1] = new int[] {0,2};
jagged2[2] = new int[] {5,11,22};
jagged2[3] = new int[] {3,5,7,10,32};
// 3. 一次性初始化
var jagged3 = new int[][]
{
new int[] {1,3,5,7,9},
new int[] {0,2},
new int[] {5,11,22},
new int[] {3,5,7,10,32}
};
string[][] data = new string[3][];
data[0] = new[] {"姓名","口頭禪","籍貫"};
data[1] = new[] {"劉大夫","很是費勁","《一日一囧》"};
data[2] = new[] {"蠟筆小新","老婆!"}; // 只有 2 欄
// foreach 寫法:先取行陣列,再取欄
foreach (string[] row in data)
{
foreach (string col in row) Console.Write(col + "\t");
Console.WriteLine();
}
// for 寫法:需分別取 row.Length
for (int r = 0; r < data.Length; r++)
{
for (int c = 0; c < data[r].Length; c++)
Console.Write(data[r][c] + "\t");
Console.WriteLine();
}
// 交錯陣列:第 3 行只有 2 欄,第 3 欄根本不存在
// 矩形陣列:若宣告 [3,3],第 3 行第 3 欄佔位存在,值為 null
string[][] jagged = new string[3][];
jagged[2] = new string[2]; // 僅 2 欄
string[,] rect = new string[3,3]; // 固定 3x3
// 遍歷輸出會發現:矩形陣列第 3 行第 3 欄輸出 "-------"(null 佔位)
// 交錯陣列則直接只輸出 2 欄,第 3 欄不存在
Length:一維=元素數,多維=總元素數,單維長度用 GetLength(d)。foreach:支援任意維度線性遍歷,**唯讀**,修改請用 for。arr[row][col]。Array 靜態方法:Clear、IndexOf、Sort/Reverse。