理解C#中的陣列
C# 中的陣列是一種基本的資料結構,允許開發人員將同型別的元素集合儲存在連續的記憶體位置中。 陣列可以是一維的、多維的或巢狀的。
這篇有關 C# 陣列的文章受到 Layla Porter 的教育影片《C# 初學者入門第五部分 - 陣列與更多迴圈。》的啟發。在她的影片中,Layla 探討了陣列的基本原理,並介紹了更多 C# 中的迴圈技巧,使觀眾具備有效管理集合並迭代資料的基本技能。
理解陣列
Layla 先從解釋 C# 中固定長度的集合入手。 與一些其他程式語言中可以動態改變大小的陣列不同,C# 中的陣列一旦建立就不能更改。 這意味著由於記憶體分配限制,其大小不能在初始化後更改。
簡單控制台互動:選擇您最喜歡的起司
在以下程式碼中,與陣列相比,Layla (1:50) 首先演示了如何向使用者展示一個可供選擇的項目列表。
Console.WriteLine("Hello, what is your favourite cheese from this list?");
Console.WriteLine("1. Stilton");
Console.WriteLine("2. Cheddar");
Console.WriteLine("3. Pineapple");
Console.WriteLine("4. Brie");
var favouriteCheese = Console.ReadLine();
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");Console.WriteLine("Hello, what is your favourite cheese from this list?");
Console.WriteLine("1. Stilton");
Console.WriteLine("2. Cheddar");
Console.WriteLine("3. Pineapple");
Console.WriteLine("4. Brie");
var favouriteCheese = Console.ReadLine();
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");此程式碼首先使用 Console.WriteLine 向控制台印出一條消息,詢問使用者他們最喜歡的起司是什麼。 然後,它再使用 Console.WriteLine 四次以上將起司列表印到控制台。 程式碼接著使用 Console.ReadLine 從控制台中讀取使用者的輸入並將其儲存在變數 favouriteCheese 中。 最後,程式碼再次使用 Console.WriteLine 向控制台印出一條包含使用者喜愛的起司的消息。
Layla 在 2:04 時執行此程式碼以展示其工作原理:

宣告陣列 - 陣列初始化
為了說明,Layla 首先演示如何宣告和初始化一個字串陣列,在此例中是一個最初呈現給使用者的起司清單。 她介紹了一維陣列的定義語法(2:30),並使用大括號將其用初始值填充(2:54)。
string[] cheeses = { "Brie", "Cheddar", "Stilton", "Gouda" };string[] cheeses = { "Brie", "Cheddar", "Stilton", "Gouda" };她強調了陣列中基於零的索引法的重要性,其中在單一維度陣列中的第一個元素使用索引 0 存取。隨後,Layla 繼續展示如何使用 for 迴圈迭代陣列。這種迴圈結構在程式化中至關重要,因為它允許根據指定條件重複執行程式碼。
實作迴圈
在進入迴圈主題時,Layla 介紹了帶有三個基本組成部分的 for 迴圈:初始化、條件和迴圈終止。 此迴圈用於根據陣列的長度迭代其元素。
for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(cheeses[i]);
}for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(cheeses[i]);
}她在 4:44 時強調,cheeses.Length 給出陣列中的元素數,確保迴圈精確地遍歷每一個元素。 變數 i 作為迴圈指標變數,用於通過索引進行迭代。 這有效地印出單個陣列元素,而不必多次編寫 Console.WriteLine 方法,如上所示而不具存取陣列元素。 Layla 於 6:17 執行應用程式,以顯示此 for 迴圈的輸出與上例完全相同:

排序與不變性
Layla 解釋了排序的好處,然後在 7:17 時示範了使用 Sort 方法按字母順序排序陣列,並警告由於 C# 中陣列的不變性,排序實際上會在背後建立一個新陣列。 這是一個理解資料操作如何影響記憶體和性能的關鍵點。
Array.Sort(cheeses);Array.Sort(cheeses);她還展示如何直接修改陣列中的個別元素而不建立新陣列(8:10),說明在不變性中的可變性。 要取代的元素索引位於 cheeses 陣列變數後的方括號中:
cheeses[0] = "Roquefort";cheeses[0] = "Roquefort";這將取代索引 0 上的 "Brie" 陣列元素為新值 "Roquefort"。
更新起司清單:處理新條目 (8:46)
Layla 解釋了我們如何可以將值附加到現有的列表中。這涉及取出現有值和新值,建立一個包含兩者的新陣列,並更新我們的參考以指向此新陣列。 下面的程式碼演示了如何運行:
var favouriteCheese = Console.ReadLine();
bool containsFavourite = false;
foreach (var cheese in cheeses)
{
if (favouriteCheese == cheese)
{
containsFavourite = true;
}
}
if (!containsFavourite)
{
cheeses = cheeses.Append(favouriteCheese).ToArray();
}var favouriteCheese = Console.ReadLine();
bool containsFavourite = false;
foreach (var cheese in cheeses)
{
if (favouriteCheese == cheese)
{
containsFavourite = true;
}
}
if (!containsFavourite)
{
cheeses = cheeses.Append(favouriteCheese).ToArray();
}此例子展示了使用基本陣列操作和 foreach 迴圈簡化操作過程,以檢查起司是否已在列表中。如果沒有,Layla 在 13:33 使用來自 System.Linq 的 Append 方法將其附加到陣列中。
Layla 在 13:50 時表示,程式碼出錯的原因是 cheeses 和 Append 的結果是不同型別。Append 返回一個 IEnumerable,它是一個針對集合的介面。 要修復此問題,我們使用 ToArray() 方法將 IEnumerable 轉換為一個陣列,然後將它賦值回 cheeses。 Layla 提到黃色波浪線是編譯器警告,表明潛在問題,例如 favouriteCheese 為空,但我們在本次演示中忽略了安全檢查。
更新並印出起司清單
Layla 解釋說,一旦我們向陣列中新增了一個項目,應將更新後的清單印到螢幕上。 為了達成此目的,我們使用 for 迴圈,印出每個元素與其索引,以顯示陣列現在包含更多項目。
Console.WriteLine("The new list:");
for (var i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(i + " " + cheeses[i]);
}
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");Console.WriteLine("The new list:");
for (var i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(i + " " + cheeses[i]);
}
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");這展示了 C# 中陣列的動態性,顯示如何新增元素並通過印出陣列內容來驗證更新。
Layla 然後運行應用程式以顯示新新增的起司 (15:19):

使用物件陣列增強功能
為了擴展理解,Layla 通過建立一個帶有 Name 和 Strength 屬性 Cheese 類來引入物件陣列 (16:14)。 然後,她將字串清單替換為一個 Cheese 物件的陣列,並展示如何在迴圈中存取物件的屬性 (17:46)。
class Cheese
{
public string Name { get; set; }
public int Strength { get; set; }
public Cheese(string name, int strength)
{
Name = name;
Strength = strength;
}
}
Cheese[] cheeses = new Cheese[]
{
new Cheese("Stilton", 3),
new Cheese("Cheddar", 2),
new Cheese("Pineapple", 1),
new Cheese("Brie", 2)
};
cheeses[0] = new Cheese("Roquefort", 4);class Cheese
{
public string Name { get; set; }
public int Strength { get; set; }
public Cheese(string name, int strength)
{
Name = name;
Strength = strength;
}
}
Cheese[] cheeses = new Cheese[]
{
new Cheese("Stilton", 3),
new Cheese("Cheddar", 2),
new Cheese("Pineapple", 1),
new Cheese("Brie", 2)
};
cheeses[0] = new Cheese("Roquefort", 4);這一部分提供了如何使用陣列封裝複雜資料結構的基礎理解,提供在程式設計中靈活性和能力。
在迴圈中使用起司物件
Layla 現在展示如何將更新的清單中的所有元素印到螢幕上。 在此場景中,每個起司以具有 Name 和 Strength 屬性的物件表示。 for 迴圈在此 Cheese 物件的陣列中迭代,每次迭代直接處理一個陣列元素。
for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine($"{cheeses[i].Name}, Strength: {cheeses[i].Strength}");
}for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine($"{cheeses[i].Name}, Strength: {cheeses[i].Strength}");
}此迴圈簡化了存取儲存在 cheeses 陣列中 Cheese 物件屬性的操作。 Layla 在 20:34 時運行程式,輸出如下:

結論
總而言之,Layla Porter 的有關 C# 中的陣列與迴圈 的教學為初學者打下了良好基礎,讓他們理解這些基本概念。通過掌握陣列和各種迴圈結構,正在學習 C# 的開發者可以在他們的程式中有效地操控資料結構並迭代集合。 理解這些基本點對於建構更複雜的應用程式和探討 C# 程式設計的進一步面向至關重要。
通過遵循 Layla 的例子和解釋,初學者能夠在自己的 C# 專案中有效地使用陣列和迴圈,增強信心。 為了深入學習 C# 中集合和進階的二維與巢狀陣列,建議學習者探索後續的教學和實踐練習。




