跳至頁尾內容
Iron Academy Logo
學習C#
學習C#

其他類別

理解C#中的陣列

Layla Porter
21m 53s

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 時執行此程式碼以展示其工作原理:

Understanding Csharp Arrays 1 related to 簡單控制台互動:選擇您最喜歡的起司

宣告陣列 - 陣列初始化

為了說明,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 迴圈的輸出與上例完全相同:

Understanding Csharp Arrays 2 related to 實作迴圈

排序與不變性

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.LinqAppend 方法將其附加到陣列中。

Layla 在 13:50 時表示,程式碼出錯的原因是 cheesesAppend 的結果是不同型別。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):

Understanding Csharp Arrays 3 related to 更新並印出起司清單

使用物件陣列增強功能

為了擴展理解,Layla 通過建立一個帶有 NameStrength 屬性 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 現在展示如何將更新的清單中的所有元素印到螢幕上。 在此場景中,每個起司以具有 NameStrength 屬性的物件表示。 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 時運行程式,輸出如下:

Understanding Csharp Arrays 4 related to 在迴圈中使用起司物件

結論

總而言之,Layla Porter 的有關 C# 中的陣列與迴圈 的教學為初學者打下了良好基礎,讓他們理解這些基本概念。通過掌握陣列和各種迴圈結構,正在學習 C# 的開發者可以在他們的程式中有效地操控資料結構並迭代集合。 理解這些基本點對於建構更複雜的應用程式和探討 C# 程式設計的進一步面向至關重要。

通過遵循 Layla 的例子和解釋,初學者能夠在自己的 C# 專案中有效地使用陣列和迴圈,增強信心。 為了深入學習 C# 中集合和進階的二維與巢狀陣列,建議學習者探索後續的教學和實踐練習。

Hero Worlddot related to 理解C#中的陣列
Hero Affiliate related to 理解C#中的陣列

分享您所愛以賺取更多報酬

您是否為使用 .NET、C#、Java、Python 或 Node.js 的開發者建立內容?將您的專業知識轉化為額外收入!

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話