陣列是 C# 基礎資料結構,for 迴圈是遍歷陣列賦值的經典方式。本文系統說明一維陣列宣告、初始化、以及 for 迴圈賦值的完整模式。
// 宣告並建立長度為 n 的字串陣列,元素預設為 null
string[] strArray = new string[n];
// 整數陣列,元素預設為 0
int[] intArray = new int[10];
// 編譯器自動推斷長度
int[] scores = { 85, 92, 78, 96, 88 };
string[] days = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
// 等價於
int[] scores = new int[] { 85, 92, 78, 96, 88 };
string[] strArray = new string[n];
for (int i = 0; i < n; i++)
{
// 計算或取得值
string value = GetValue(i); // 自訂邏輯
strArray[i] = value;
}
// 假設 DataTable 有 n 行
string[] columnValues = new string[dt.Rows.Count];
for (int i = 0; i < dt.Rows.Count; i++)
{
// 取得第 i 行的 "ColumnName" 欄位值
columnValues[i] = dt.Rows[i]["ColumnName"].ToString();
}
// 反向填入
for (int i = n - 1; i >= 0; i--)
{
array[i] = GetValue(n - 1 - i);
}
// 間隔填入 (每隔 2 個索引)
for (int i = 0; i < n; i += 2)
{
array[i] = GetEvenIndexValue(i / 2);
}
// 僅能讀取,無法修改陣列元素
foreach (string s in strArray)
{
Console.WriteLine(s);
// s = "new"; // 編譯錯誤:foreach 迭代變數唯讀
}
// 二維陣列宣告
int[,] matrix = new int[3, 4]; // 3 列 4 行
// 二維陣列初始化
int[,] matrix = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
// 雙重 for 迴圈遍歷
for (int row = 0; row < matrix.GetLength(0); row++)
{
for (int col = 0; col < matrix.GetLength(1); col++)
{
matrix[row, col] = row * 10 + col;
}
}
// 陣列 → List
string[] array = { "A", "B", "C" };
List list = new List(array);
// 或
List list = array.ToList(); // 需 using System.Linq;
// List → 陣列
List list = new List { "A", "B", "C" };
string[] array = list.ToArray();
| 錯誤 | 原因 | 正確做法 |
|---|---|---|
array[i] = ... 索引超出範圍 | 迴圈條件 i <= n 應為 i < n | for (int i = 0; i < array.Length; i++) |
| foreach 內修改陣列元素 | 迭代變數唯讀 | 改用 for 迴圈或 List |
| 陣列未初始化即使用 | 參考型別陣列元素預設 null | new string[n] 確保建立陣列物件 |
| 結構體陣列元素屬性無法修改 | 值型別回傳副本 | 整體替換:array[i] = new Struct { Prop = val } |
array.Length 屬性存取極快 (JIT 內建),迴圈條件無需快取Span<T>、Memory<T> 避免邊界檢查Parallel.For (需評估負載平衡開銷)for 迴圈配合索引器是陣列賦值最基本、最高效的方式。掌握宣告初始化語法、索引邊界條件、資料來源對應邏輯,即可熟練處理各類陣列填充需求。現代 C# 亦提供 List<T>、LINQ、Span<T> 等更高階抽象,視複雜度選擇適當工具。