iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0

改變陣列大小
Array.Resize(ref 陣列名稱, newsize);

using System;

namespace HelloWorld
{
  class Program
  {
    static void Main(string[] args)
    {
      string[] fruit = {"Orange","Apple","Banana","Grape"};
      //改變陣列大小 Resize方法-增加長度
      Array.Resize(ref fruit, fruit.Length +2);
      fruit[4] = "Waterlemon";
      fruit[5] = "Strawberry";
      Console.WriteLine("\n改變後陣列元素:");
      foreach (string item in fruit)
      Console.Write($"{item,5} ");
      //改變陣列大小 Resize方法-縮減長度
      Array.Resize(ref fruit, fruit.Length-1);
       Console.WriteLine("\n變小後陣列元素:");
      foreach (string item in fruit)
	  Console.Write($"{item,5} ");      
    }
  }
}

陣列的複製
CopyTo(array, index);
array:指定的目標陣列
index:欲複製陣列的開始位置
使用CopyTo()方法會將來源陣列的元素全部複製到新的陣列。

若指定欲複製的元素,則Array類別的靜態方法Copy()來實施,語法如下:
Array.Copy(sourceArray, destinationArray, length);
sourceArray:來源陣列
destinationArray:目的陣列
length:欲複製的項目數,其資料型別為 Int32或 Int64

using System;

namespace HelloWorld
{
  class Program
  {
    static void Main(string[] args)
    {
      string[] fruit = {"Orange","Apple","Banana","Grape","pineapple","papaya"};
	  string[] produce = new string[fruit.Length];
      string[] product = new string[4];
      fruit.CopyTo(produce, 0);
      Console.WriteLine("使用CopyTo() 方法:");
      foreach (string item in produce)
      Console.Write($"{item},");
      Console.WriteLine();
      Array.Copy(fruit, product,4);
      Console.WriteLine("使用靜態Copy() 方法:");
      foreach (string item in product)
      Console.Write($"{item},");
      Console.WriteLine();
    }
  }
}

建立二維陣列
1.宣告⇒ 資料型別[ , ] 陣列名稱;
2.配置記憶體⇒ 陣列名稱 = new 資料型別 [列數, 欄數];
1+2 ⇒ 資料型別[ , ] 陣列名稱 = new 資料型別 [列數,欄數];

int[ , ] number = number;
number = new int[4,3];

二為陣列初始化
陣列名稱 [列索引編號, 欄索引編號] = 初值;

int[ , ] number = new int[4,3];
number[0,1] = 64;

int[ , ] number = {{75,64,96},{55,67,39},{42,92,85},{71,69,81}};
int[ , ] number2 = new int[4,3] {{75,64,96},{55,67,39},{42,92,85},{71,69,81}};

GetLength()方法:取得陣列維度值後再指派給變數使用
陣列名稱.GetLength(陣列維度);

int[,] score = {{75,64,96},{55,67,39}};
//變數row回傳值為2 =>2列
int row = score.GetLength(0);
//變數column回傳值為3 =>3欄
int column = score.GetLength(1);

另一種取得列欄的方法
GetLowerBound()、GetUpperBound()

string[] name = {"Mary","Tomas","John"};
//取得一維陣列的下界值0
int lower = name.GetLowerBound(0);
//取得一維陣列的上界值2
int upper = name.GetUpperBound(0);

練習for讀取二維陣列元素
這段程式的目的是:

  1. 先顯示學生的名字。
  2. 再顯示每個學生的成績,並把每科的總分計算出來。
  3. 最後,顯示每科的總分。
using System;

namespace HelloWorld
{
  class Program
  {
    static void Main(string[] args)
    {
      string[] name = { "Mary", "Tomas", "John" };
      int[,] score = { { 75, 64, 96 }, { 55, 67, 39 }, { 45, 92, 85 }, { 71, 69, 81 } };
      Console.Write($"    ");
      // 輸出名字
      foreach (string name2 in name)
      {
	      //{name2,8} 這個格式是讓每個名字有固定寬度 8 的位置,這樣可以保證名字之間有一定的間隔。
        Console.Write($"{name2,8}");  // 讓名字之間有足夠空間
      }
      Console.WriteLine();  // 換行

      // 取得第1、2維陣列
      int row = score.GetLength(0);
      int column = score.GetLength(1);
      int[] sum = new int[column];
	
      // 輸出成績並計算總和
      for (int outer = 0; outer < row; outer++)
      {
      	Console.Write($"    ");
        for (int inner = 0; inner < column; inner++)
        {
          Console.Write($"{score[outer, inner],8}");  // 輸出分數
          sum[inner] += score[outer, inner];  // 動態累加對應列的分數
        }
        Console.WriteLine();  // 每列結束後換行
      }
	   Console.WriteLine($"-------------------------------");
      // 輸出每列的總和
      Console.Write($"{"sum:"}");
      for (int i = 0; i < sum.Length; i++)
      {
        Console.Write($"{sum[i],8}");  // 總和數值的間距設定
      }
      Console.WriteLine();  // 換行
    }
  }
}

印出結果
https://ithelp.ithome.com.tw/upload/images/20240917/20121669MkHOxLRkg7.png

不規則陣列
採用不規則陣列情形:若從資料庫擷取資料,並不知道多少資料,無法以固定陣列處理。
不規則陣列就是陣列裡的元素也是陣列,也有人稱"陣列中的陣列"或"鋸齒陣列"。
由於陣列元素採參考型別,初始化時為null;陣列的每一列長度也有可能不同,意味著陣列的每一列也必須實體化才能使用。使用不規則陣列跟其他陣列一樣先做宣告、再以new運算子取得記憶體空間,設定陣列長度。

資料型別[][] 陣列名稱 = new 資料型別 [陣列大小][];
陣列名稱[0] = new 資料型別 [] {...};
陣列名稱[1] = new 資料型別 [] {...};

有四種方式:
第一種方式

int[][] number = new int[3][]; // 宣告3個一維陣列
number[0] = new int[4]; // 初始化第一列陣列,存放4個元素
number[1] = new int[3];
number[2] = new int[5];

第二種方式

int[][] number2 = new int[3][]; // 宣告陣列
number2[0] = new int[] {11,12,13,14}; 
number2[1] = new int[] {22,23,24};
number2[2] = new int[] {31,32,33,34,35};

第三種方式

int[][] number3 = new int[][]
{
	new int[] {11,12,13,14},
	new int[] {22,23,24},
	new int[] {31,32,33,34,35}
};

第四種方式

int[][] number4 =  
{
	new int[] {11,12,13,14},
	new int[] {22,23,24},
	new int[] {31,32,33,34,35}
};

練習不規則陣列

using System;

namespace HelloWorld
{
  class Program
  {
    static void Main(string[] args)
    {
    	//1.宣告不規則陣列subject
		string[][] subject = new string[3][];
        //2.陣列以new運算子初始化
        subject[0] = new string[]
        {"Tomas","國文","英文會話","程式設計"};
        subject[1] = new string[]
        {"Molly","國文","計算機概論"};
        subject[2] = new string[]
        {"Eric","英文","數學","多媒體論","應用文"};
        
      // 外層 For 迴圈利用 subject.Length 長度來遍歷所有學生,這裡共有 3 位學生
      for (int one = 0; one < subject.Length; one++)
      {
          // 內層 for 迴圈利用 subject[one].Length 長度來取得每位學生修的課程數量
          for (int two = 0; two < subject[one].Length; two++)
          {
              Console.Write($"{subject[one][two]}\t");  // 輸出學生的名字及其課程
          }
          Console.WriteLine();  // 每個學生資料輸出完後換行
      }
    }
  }
}

隱含型別陣列
隱含意義,相對於”明確宣告”,它有”不明確表示”的意涵
通常建立陣列時要明確宣告它的資料型別。隱含型別是對於陣列的資料型別不做明確表示。

var 陣列名稱 = new []{...}; 
var data = new [] {11,21,310,567}; // int[]
using System;

namespace HelloWorld
{
  class Program
  {
    static void Main(string[] args)
    {
		var number = new [] { new[] {68,135,83}, new[] {75,64,211,37}};
        Console.WriteLine("讀取隱含不規則陣列:");
        for (int one = 0; one < number.Length; one++)
        {
        	for (int two = 0; two < number[one].Length; two++)
            {
            	Console.Write($"{number[one][two],4}");
            }
        }
    }
  }
}

以上來源:從零開始學visual C# 2017程式設計、W3Schools、詢問chatGPT
內容有誤的話,請留言或發訊息給我


上一篇
Day2-C#陣列寫法學習Part1
下一篇
Day4-C#陣列寫法學習Part3
系列文
初學C#之路:30天基礎學習與實作紀錄10
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言