# 陣列 ## What: 什麼是陣列 將相同型態的變數集合起來,以一個名稱代表。 例如:同一個班級裡的學生姓名、同一個班級裡的學生分數。 ## How: 怎麼在C#裡面使用陣列 ### Declaration ```csharp // 方法一 型別[] 陣列名稱; // 方法二 型別[] 陣列名稱 = new 型別[陣列長度]; ``` ```csharp // 陣列名稱宣告 string[] classOfSunflower; // 陣列長度宣告 string[] classOfSunflower = new string[3]; ``` ### Initialization ```csharp // 方法一 型別[] 陣列名稱 = new 型別[陣列長度]{初始值}; // 方法二 型別[] 陣列名稱 = {初始值}; ``` ```csharp // 陣列長度+初始值 string[] classOfSunflower = new string[3] { "Alex", "Ken", "Leo" }; // 初始值 int[] scoresOfSunflower = { 89, 59, 69 }; ``` ### Read ```csharp int scoreOfAlex = scoresOfSunflower[0]; ``` ```csharp // 讀取Alex的分數 int scoreOfAlex = scoresOfSunflower[0]; ``` ### Update ```csharp scoresOfSunflower[0] = 84; ``` ```csharp // 修改Alex的分數 scoresOfSunflower[0] = 79; ``` > 用index可以獲取陣列內的個別元素 > 關鍵字: [IList](https://learn.microsoft.com/zh-tw/dotnet/api/system.collections.ilist?view=net-7.0) ## Why: 為什麼要使用陣列 **性質相同 ⇒ 做相同的事** 情境一:印出向日葵班裡面每個學生的名字 使用foreach陳述式 關鍵字: [IEnumerable](https://learn.microsoft.com/zh-tw/dotnet/api/system.collections.ienumerable?view=net-8.0) ```csharp Consile.WriteLine(classOfSunflower); //System.Int32[] // Console.WriteLine() 方法對於非基本型別的物件(例如自定義類別、結構、陣列等)預設會印出其型別名稱而不是內容。 foreach (string name in classOfSunflower) { Console.WriteLine(name); } ``` 情境二:期末考太難,總成績加五分 使用for陳述式 ```csharp for (int i = 0; i < scoresOfSunflower.Length; i++) { scoresOfSunflower[i] += 5; } ``` ## 二維陣列 ### Declaration ```csharp // 方法一 型別[,] 陣列名稱 = new 型別[row number,column number]; // 方法二 型別[,] 陣列名稱 = new 型別[row number,column number]{初始值}; ``` ```csharp int[,] arrA = new int[2, 2]; arrA[0, 0] = 5; arrA[0, 1] = 6; arrA[1, 0] = 7; arrA[1, 1] = 8; int[,] arrB = new int[2, 2] { { 1, 2 }, { 3, 4 } }; ``` ![宣告二維陣列](https://hackmd.io/_uploads/SJz9_axxR.png) ### 二維陣列相加 ![二維陣列](https://hackmd.io/_uploads/S1-SO6xgA.png) ```csharp // arrA + arrB = arrC int[,] arrC = new int[2, 2]; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { arrC[i, j] = arrA[i, j] + arrB[i, j]; } } foreach (int c in arrC) { Console.WriteLine(c); } ``` ### 矩陣相乘 ![image](https://hackmd.io/_uploads/BkEaYTlgA.png) ## 陣列常用的屬性及方法 [參考網址](https://learn.microsoft.com/zh-tw/dotnet/api/system.array?view=net-7.0#properties) ```csharp // 2*2的矩陣乘以2*1的矩陣 int[,] matrixA = new int[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } }; int[,] matrixB = new int[3, 1] { { 7 }, { 8 }, { 9 } }; int[,] matrixC = new int[2, 1]; // matrixA * matrixB = matrixC for (int row = 0; row < 2; row++) { for (int column = 0; column < 1; column++) { for (int inner = 0; inner < 3; inner++) { matrixC[row, column] += matrixA[row, inner] * matrixB[inner, column]; } } } ``` Length: 取得陣列所有維度的元素總數。 Rank: 取得陣列的維度數目。 GetLength(): 取得代表陣列指定維度之項目數目。 ## 練習時間 1. 利用一維陣列求10個數字的計算平均值(p.7) 2. 輸入10個數字至A陣列,再輸入x,判斷x是否存在於A陣列中,如果存在,輸出所在的註標(索引)值,若不存在,則告知不存在。(p.11) 3. 求兩個2*4的二維矩陣相加之結果,第一個及第二個矩陣分別以A及B表示,相加之結果存入C矩陣,最後將C矩陣內容顯示出來。(p.14)