---
# System prepended metadata

title: foreach 的魔法
tags: [IEnumerable, ' C#', ' IEnumerator']

---

---
tags: IEnumerable, IEnumerator, C#
---
<!-- 使用黑色主題 -->
{%hackmd BkVfcTxlQ %}
<!-- 決定 CSS 樣板 -->
{%hackmd @aidan/inc_hackmd_css %}

# foreach 的魔法

## <span class="Title">主題０. 暖暖身</span>

### <span class="SubTitle">Lab０-1  使用 foreach 列舉出動物園內的所有動物</span>
[執行程式](https://repl.it/@aidanlu/lab0-1)
```C#=
using System;

class MainClass {
  public static void Main (string[] args) {

    string[] zoo = { "Cat", "Dog", "Duck" };

    Console.WriteLine("目前動物園的動物已經有：");
    foreach (var item in zoo) // 列舉陣列中的元素。
    {
      Console.WriteLine($"{item}");
    }
  }
}
```
執行結果
![](https://i.imgur.com/emPQG5Q.png)
<span class="Figure">(Fig. 0-1)</span>

<span class="HightLigh150">陣列物件本身就自帶「列舉器」（enumerator），而 foreach 背後的魔法是因為，foreach 其實是透過 enumerator 依序取得陣列裡面的每一個元素。
C# 的 enumerator 其實就是 <font color="#06f">IEnumerator</font> 介面的實作</span>
![](https://i.imgur.com/6Aofbeu.png)
<span class="Figure">(Fig. 0-2)</span>
* **Current**：取得位於列舉索引值目前位置的元素。
* **MoveNext()**：將列舉索引值往前推下一個項目。

### <span class="SubTitle">Lab０-2  使用 <font color="#06f">IEnumerator (列舉器)</font> 列舉出動物園內的所有動物</span>
[執行程式](https://repl.it/@aidanlu/lab0-2)
![](https://i.imgur.com/wVDLiUc.png)
<span class="Figure">(Fig. 0-3)</span>



### <span class="SubTitle">Array 抽象類別</span>
<font color="#06f">Array</font> 介面 抽象類別
![](https://i.imgur.com/3J7m4A7.png)
<span class="Figure">(Fig. 0-4)</span>
<font color="#06f">IEnumerable</font> 介面
![](https://i.imgur.com/MViAmxw.png)
<span class="Figure">(Fig. 0-5)</span>
所有的陣列型別都繼承自 Array 抽象類別，因此得實作 IEnumerable，而透過 IEnumerable 可以取得 enumerator

## <span class="Title">主題1. 實作 IEnumerator 與 IEnumerable</span>
### <span class="SubTitle">Lab1-1</span>
<font color = "Red">[執行程式</font>    大J](https://repl.it/@jacklouk/Class4Lab1-1#main.cs)

執行結果
![](https://i.imgur.com/Tfg9jNt.png)
<span class="Figure">(Fig. 0-6)</span>

main.cs
```C#=
using System;

class MainClass {
  public static void Main (string[] args) {

    Zoo zoo = new Zoo();

    Console.WriteLine("目前1號動物園的動物已經有：");
    foreach (var item in zoo) {
        Console.WriteLine($"{item}");
    }

    string[] animals = { "阿貓", "鴨鴨", "大象" };
    Zoo zoo2 = new Zoo(animals);

    Console.WriteLine("\n目前2號動物園的動物已經有：");
    foreach (var item in zoo2) {
        Console.WriteLine($"{item}");
    }
  }
}
```

Zoo.cs <font color = "Red">(完成紅色框框的程式碼)</font>
![](https://i.imgur.com/ZrxCKnd.png)
<span class="Figure">(Fig. 0-7)</span>

ZooEnumerator.cs <font color = "Red">(完成紅色框框的程式碼)</font>
![](https://i.imgur.com/984eOXl.png)
<span class="Figure">(Fig. 0-8)</span>


