--- tags: IEnumerable, IEnumerator, C# --- <!-- 使用黑色主題 --> {%hackmd BkVfcTxlQ %} <!-- 決定 CSS 樣板 --> {%hackmd @aidan/inc_hackmd_css %} # foreach 的魔法 ## <span class="Title">主題0. 暖暖身</span> ### <span class="SubTitle">Lab0-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">Lab0-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>