為什麼 foreach 可以遍歷所有 Collection?從設計角度理解 IEnumerable
前言 上一篇文章,我開始理解不同 Collection 存在的原因。Array、List、Dictionary、Queue、Stack 各自解決不同的資料管理問題,底層實作也不一樣。 理解這件事後,我突然想到另一個問題。 如果每一種 Collection 都長得不一樣,為什麼 foreach 卻能遍歷所有 Collection? 例如: List<int> list = new() { 1, 2, 3 }; foreach (var item in list) { Console.WriteLine(item); } 可以正常運作。換成 Dictionary: Dictionary<int, string> dictionary = new() { { 1, "Jack" }, { 2, "Amy" } }; foreach (var item in dictionary) { Console.WriteLine(item); } 也完全沒問題,甚至 Queue、Stack、HashSet 都能使用 foreach。 它們明明是不同的資料結構,foreach 又是怎麼做到的? 如果 foreach 必須認識每一種 Collection 我試著站在 .NET Framework 設計者的角度思考。 假設沒有任何共同規範,那 foreach 要怎麼設計? 最直接的方法,大概會變成: 如果是 List 就用 List 的方式遍歷 如果是 Dictionary 就用 Dictionary 的方式遍歷 如果是 Queue 就用 Queue 的方式遍歷 ... 問題很快就出現了:每新增一種 Collection,foreach 就必須修改一次。如果有人自己寫了一個新的 Collection,foreach 也不知道該怎麼遍歷它。 ...