練習 - 建立和設定反覆運算迴圈

已完成

表面上,for 陳述式是另一個反覆項目陳述式,可讓您逐一查看程式碼區塊,並藉此變更程式碼的執行流程。 不過,一旦我們檢查每個陳述式的運作方式,就可以更清楚地識別每個反覆項目陳述式的微妙差異,以及其使用時機。

什麼是 for 陳述式?

for 陳述式會逐一查看程式碼區塊達特定次數。 此控制的等級可讓 for 陳述式在其他反覆運算陳述式中是唯一的。 foreach 陳述式會針對一連串資料 (如陣列或集合) 中的每個項目,逐一查看程式碼區塊一次。 while 陳述式則會逐一查看程式碼區塊,直到符合條件為止。

此外,for 陳述式可透過公開反覆運算的條件,讓您更進一步控制反覆運算的處理序。

在本練習中,您將使用 for 陳述式,學習如何控制反覆運算的前置條件、完成條件、其反覆運算模式等。 此外,您將了解 for 陳述式的常見使用案例。

好的,現在讓我們準備撰寫程式碼環境,並開始檢查實作 for 陳述式的程式碼範例。

準備您的撰寫程式碼環境

本課程模組包含實際操作活動,可引導您完成建置及執行示範程式碼的程序。 我們鼓勵您使用 Visual Studio Code 做為開發環境來完成這些活動。 針對這些活動使用 Visual Studio Code,可協助您更熟悉在全球專業人員使用的開發人員環境中撰寫及執行程式碼。

  1. 打開 Visual Studio Code。

    您可以使用 Windows [開始] 功能表 (或另一個作業系統的對等資源) 來開啟 Visual Studio Code。

  2. 在 Visual Studio Code 的 [檔案] 功能表上,選取 [開啟資料夾]。

  3. 在 [開啟資料夾] 對話方塊中,瀏覽至 Windows Desktop 資料夾。

    如果您在不同的資料夾位置中保留程式碼專案,您可以改用該資料夾位置。 針對本訓練,請務必使用容易找到並記住的位置。

  4. 在 [開啟資料夾] 對話方塊中,選取 [選取資料夾]。

    如果您看到詢問您是否信任作者的安全性對話方塊,請選取 [是]。

  5. 在 Visual Studio Code 的 [終端] 功能表上,選取 [新增終端]。

    請注意,終端面板中的命令提示字元會顯示目前資料夾的資料夾路徑。 例如:

    C:\Users\someuser\Desktop>
    

    注意

    如果您是在自己的電腦上工作,而不是在沙箱或託管環境中工作,且您已完成此 C# 系列中的其他 Microsoft Learn 課程模組,您可能已針對程式碼範例建立專案資料夾。 如果是這種情況,您可以略過下一個步驟,這個步驟會用來在 TestProject 資料夾中建立主控台應用程式。

  6. 在終端命令提示字元中,若要在指定的資料夾中建立新的主控台應用程式,請輸入 dotnet new console -o ./CsharpProjects/TestProject,然後按 Enter 鍵。

    這個 .NET CLI 命令會使用 .NET 程式範本,在指定的資料夾位置中建立新的 C# 主控台應用程式專案。 這個命令會為我們建立 CsharpProjects 和 TestProject 資料夾,並使用 TestProject 做為 .csproj 檔案的名稱。

  7. 在 [總管] 面板中,展開 CsharpProjects 資料夾。

    您應該會看到 TestProject 資料夾和兩個檔案:名為 Program.cs 的 C# 應用程式檔案,以及名為 TestProject.csproj 的 C# 專案檔。

  8. 在 [總管] 面板中,若要在 [編輯器] 面板中檢視程式碼檔案,請選取 [Program.cs]。

  9. 刪除現有的程式碼。

    您將使用此 C# 主控台專案,在本課程模組期間建立、建置及執行程式碼範例。

  10. 關閉 [終端] 面板。

撰寫基本的 for 陳述式

  1. 請確定您已開啟 Visual Studio Code,並在 [編輯器] 面板中顯示 Program.cs。

    注意

    Program.cs 應該是空的。 如果不是,請選取並刪除所有程式碼。

  2. 在 Visual Studio Code 編輯器中輸入下列程式碼。

    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine(i);
    }
    

    此程式碼表示簡單的 for 陳述式,其會執行其程式碼區塊迴圈 10 次,並列印 i 的目前值。

  3. 在 Visual Studio Code 的 [檔案] 功能表上,選取 [儲存]。

    在建置或執行程式碼之前,必須先儲存 Program.cs 檔案。

  4. 在 [總管] 面板中,若要在 TestProject 資料夾位置開啟 [終端],請以滑鼠右鍵按一下 [TestProject],然後選取 [在整合式終端機中開啟]。

    [終端] 面板隨即開啟。 終端應該包含命令提示字元,顯示已對 TestProject 資料夾位置開啟終端。

  5. 在終端命令提示字元中,若要執行程式碼,請輸入 dotnet run,然後按 Enter 鍵。

    注意

    如果您看到訊息指出「找不到要執行的專案」,請確定終端命令提示字元會顯示預期的 TestProject 資料夾位置。 例如:C:\Users\someuser\Desktop\csharpprojects\TestProject>

    您應該會看見下列輸出。

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
  6. 請花幾分鐘的時間來識別 for 陳述式的六個部分。

    for 陳述式包含下列六個部分:

    1. for 關鍵字。
    2. 定義 for 反覆運算條件的一組括號。 這些括號包含三個不同的部分,並以陳述式運算子的結尾 (分號) 分隔。
    3. 第一個部分會定義和初始化迭代器變數。 在此範例中為:int i = 0。 本節稱為初始設定式
    4. 第二個部分會定義完成條件。 在此範例中為:i < 10。 換句話說,當 i 小於 10 時,執行階段會繼續逐一查看 for 陳述式底下程式碼區塊中的程式碼。 當 i 變成等於 10 時,執行階段會停止執行 for 陳述式的程式碼區塊。 文件將這個區段稱為條件
    5. 第三個部分會定義要在每次反覆運算之後採取的動作。 在此案例中,在每次反覆運算之後,i++ 會將 i 的值遞增 1。 文件將這個區段稱為迭代器
    6. 最後是程式碼區塊。 程式碼區塊包含將針對每次反覆運算執行的程式碼。 請注意,在程式碼區塊內會參考 i 的值。 文件將這個區段稱為本文

    依據我們命名變數的規則,您可能想知道 i 對保留目前反覆運算的變數來說是否為有效名稱。 在此案例中,大部分變數將 i 視為有效。 其他常用選項為 xcounter。 當您有使用 i 的外部 for 陳述式,且需要為內部 for 陳述式建立反覆運算變數時,也會在這些情況下使用名稱 j

    注意

    這三個區段 (初始設定式、條件和迭代器) 都是選擇性項目。 不過,在實務上,通常會使用這三個區段。

變更反覆運算條件

如同我們在一開始所說,for 陳述式在反覆運算陳述式之間有兩個唯一的性質。

  • 當您事先知道需要預先逐一查看程式碼區塊的次數時,應該使用 for 陳述式。
  • for 陳述式可讓您控制每次反覆運算的處理方式。

如果我們需要逐一查看程式碼區塊,但想要倒計而不是累計,該怎麼辦?

  1. 使用 Visual Studio Code 編輯器來更新程式碼,如下所示:

    for (int i = 10; i >= 0; i--)
    {
        Console.WriteLine(i);
    }
    
  2. 請花幾分鐘檢閱更新的程式碼。

    藉由變更 for 陳述式的三個部分,我們可變更其行為。

    • 我們會將反覆項目變數初始化為 10。
    • i 小於 0 時,我們會變更完成條件以結束 for 陳述式。
    • 我們會變更迭代器的模式,以便在每次完成反覆項目時,將 i 減去 1
  3. 儲存您的程式碼檔案,然後使用 Visual Studio Code 來執行程式碼。

    從終端命令提示字元輸入 dotnet run,以執行您的程式碼。

  4. 請注意輸出已變更。

    當您執行程式碼後,您將會看到下列輸出。

    10
    9
    8
    7
    6
    5
    4
    3
    2
    1
    0
    

實驗迭代器的模式

如果我們想要略過迭代器變數中的某些值,該怎麼做?

  1. 使用 Visual Studio Code 編輯器來更新程式碼,如下所示:

    for (int i = 0; i < 10; i += 3)
    {
        Console.WriteLine(i);
    }
    
  2. 請花幾分鐘檢閱更新的程式碼。

    我們不會將迭代器變數的值遞增或遞減 1,而是在每次反覆運算之後,使用 i += 3 來略過兩個值。

  3. 儲存您的程式碼檔案,然後使用 Visual Studio Code 來執行程式碼。

    從終端命令提示字元輸入 dotnet run,以執行您的程式碼。

  4. 請注意輸出如何變更。

    當您執行程式碼後,您將會看到下列輸出。

    0
    3
    6
    9
    

    無可否認地,您不會經常進行這類動作,但希望您可以在需要時,知道您對反覆運算有更精細的控制層級。

使用 break 關鍵字中斷反覆運算陳述式

如果我們需要根據某個條件提前結束反覆項目陳述式,該怎麼辦? 我們可以使用 break 關鍵字。

  1. 使用 Visual Studio Code 編輯器來更新程式碼,如下所示:

    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine(i);
        if (i == 7) break;
    }
    
  2. 請花幾分鐘的時間檢閱更新程式碼中的 break 關鍵字用法。

    我們會先在「使用 C# 中的 switch-case 建構建立程式碼流程分支」課程模組中看到 break 陳述式。 事實證明,我們也可以使用 break 關鍵字來結束反覆運算陳述式。

  3. 儲存您的程式碼檔案,然後使用 Visual Studio Code 來執行程式碼。

    從終端命令提示字元輸入 dotnet run,以執行您的程式碼。

  4. 請注意輸出如何變更。

    當您執行程式碼後,您將會看到下列輸出。

    0
    1
    2
    3
    4
    5
    6
    7
    

執行每個陣列元素的迴圈

for 陳述式的常見用法是逐一查看元素陣列,特別是當需要對反覆運算的發生方式進行一些控制時。 雖然 foreach 會逐一查看陣列的每個元素,但 for 陳述式可進行調整以提供大部分的自訂。

  1. 使用 Visual Studio Code 編輯器來更新程式碼,如下所示:

    string[] names = { "Alex", "Eddie", "David", "Michael" };
    for (int i = names.Length - 1; i >= 0; i--)
    {
        Console.WriteLine(names[i]);
    }
    
  2. 請花幾分鐘檢閱更新的程式碼。

    首先,請注意,我們已具現化名為 names的字串陣列,其中包含四個名稱。

    接下來,請注意,我們使用 Array.Length 屬性來取得陣列中的元素數目,而且我們使用這個值來初始化迭代器變數 (int i = names.Length - 1)。 我們會從值減去 1,因為陣列元素的索引編號是以零起始 (四個元素的索引編號是 0-3)。

    最後,請注意,我們已選擇回溯逐一查看陣列,也就是我們無法使用 foreach 陳述式執行的動作。 我們使用程式碼區塊內的反覆運算變數值,來指定陣列元素的索引編號 (names[i])。

  3. 儲存您的程式碼檔案,然後使用 Visual Studio Code 來執行程式碼。

    從終端命令提示字元輸入 dotnet run,以執行您的程式碼。

  4. 請注意,陣列元素會以反向順序列出 (如我們所預期)。

    當您執行程式碼後,您將會看到下列輸出。

    Michael
    David
    Eddie
    Alex
    

    注意

    我們可以透過建構 for 陳述式來逐一查看陣列元素,如下所示:for (int i = 0; i < names.Length; i++)

檢查 foreach 陳述式的限制

如果您想要在 foreach 反覆運算期間更新陣列中的某個值,該怎麼辦?

  1. 使用 Visual Studio Code 編輯器來更新程式碼,如下所示:

    string[] names = { "Alex", "Eddie", "David", "Michael" };
    foreach (var name in names)
    {
        // Can't do this:
        if (name == "David") name = "Sammy";
    }
    
  2. 儲存您的程式碼檔案,然後使用 Visual Studio Code 來執行程式碼。

    從終端命令提示字元輸入 dotnet run,以執行您的程式碼。

  3. 請注意顯示的錯誤訊息。

    如果您嘗試編譯並執行此程式碼,您將會看到例外狀況。

    Cannot assign to name because it is a 'foreach iteration variable'
    

    換句話說,您無法重新指派 name 的值,因為其是 foreach 反覆運算內部實作的一部分。

使用 for 陳述式克服 foreach 陳述式的限制

讓我們嘗試使用 for 陳述式來修改反覆運算程式碼區塊內陣列的內容。

  1. 使用 Visual Studio Code 編輯器來更新程式碼,如下所示:

    string[] names = { "Alex", "Eddie", "David", "Michael" };
    for (int i = 0; i < names.Length; i++)
        if (names[i] == "David") names[i] = "Sammy";
    
    foreach (var name in names) Console.WriteLine(name); 
    
  2. 請花幾分鐘檢閱更新的程式碼。

    請注意,我們已從只包含單行程式碼的程式碼區塊中移除大括號。 此修訂會使用我們在「在 C# 中使用程式碼區塊控制變數範圍和邏輯」課程模組中所討論的同一項技巧。 許多開發人員覺得此樣式難以閱讀,而有些開發人員則偏好此縮寫樣式,因為它可協助他們更簡潔且更具表達性地撰寫。 如果您發現此程式碼難以閱讀,或如果您不偏好此樣式,請放心,大括號一律可在程式碼區塊中使用。 如果需要,請使用下列程式碼,在 [編輯器] 面板中更新程式碼:

    string[] names = { "Alex", "Eddie", "David", "Michael" };
    
    for (int i = 0; i < names.Length; i++)
    {
        if (names[i] == "David") names[i] = "Sammy";
    }
    
    
    foreach (var name in names)
    {
        Console.WriteLine(name);
    }        
    
  3. 儲存您的程式碼檔案,然後使用 Visual Studio Code 來執行程式碼。

    從終端命令提示字元輸入 dotnet run,以執行您的程式碼。

  4. 請注意,程式碼會在沒有錯誤的情況下執行,並產生所需的輸出。

    當您執行程式碼後,您將會看到下列輸出。

    Alex
    Eddie
    Sammy
    Michael
    

    由於陣列不是反覆運算陳述式實作的直屬部分,因此您可以變更陣列內的值。

概括回顧

以下是本單元的幾個優點:

  • for 反覆運算陳述式可讓您逐一查看程式碼區塊達特定次數。
  • for 反覆運算陳述式可讓您藉由改變括弧內下列三個條件來控制反覆運算機制的每個層面:初始設定式、條件和迭代器。
  • 當您需要控制想要如何逐一查看陣列中的每個項目時,通常會使用 for 陳述式。
  • 如果您的程式碼區塊只有一行程式碼,您可以視需要清除大括號和空白字元。

知識檢查

1.

下列 for 陳述何者正確?

2.

在反覆運算完成之前,應該使用下列哪一個陳述式來結束 for 迴圈?