{"id":1724,"date":"2023-05-05T21:14:32","date_gmt":"2023-05-05T14:14:32","guid":{"rendered":"https:\/\/csharptutorial.net\/?page_id=1724"},"modified":"2023-05-21T17:20:30","modified_gmt":"2023-05-21T10:20:30","slug":"csharp-iterator","status":"publish","type":"page","link":"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-iterator\/","title":{"rendered":"C# Iterator"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you will learn about the C# iterator pattern and how to use it to define an interface that iterates the elements in a collection.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to the C# Iterator design pattern<\/h2>\n\n\n\n<p>The Iterator is a behavioral design pattern that allows you to define an interface for iterating elements of a collection without exposing its underlying implementation. The Iterator pattern does this by separating the iteration logic from the collection object. <\/p>\n\n\n\n<p>The following UML diagram illustrates the C# Iterator pattern:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/csharptutorial.net\/wp-content\/uploads\/2023\/05\/CSharp-Iterator.svg\" alt=\"C# Iterator\" class=\"wp-image-1729\"\/><\/figure>\n<\/div>\n\n\n<p>The Iterator pattern has the following participants:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Iterator<\/code> is an <a href=\"https:\/\/csharptutorial.net\/csharp-tutorial\/csharp-interface\/\">interface<\/a> that defines a set of methods for iterating elements in a collection. Typically, the <code>Iterator<\/code> interface consists of the <code>Current<\/code> property, the <code>MoveNext()<\/code> method, and <code>Reset()<\/code> method. The <code>Current<\/code> property returns the current element in the collection. The <code>MoveNext()<\/code> method returns true if the next element exists and advances to the next element or returns false if no more elements to iterate. The <code>Reset()<\/code> is an optional method that resets the iterator to the initial state.<\/li>\n\n\n\n<li><code>ConcreteIterator<\/code> is a <a href=\"https:\/\/csharptutorial.net\/csharp-tutorial\/csharp-class\/\">class<\/a> that provides a concrete implementation of the <code>Iterator<\/code> interface that iterates elements in the collection.<\/li>\n\n\n\n<li><code>Aggregate<\/code> is an interface that has the <code>createIterator()<\/code> method for creating an <code>Iterator<\/code> object. Typically, you define a collection class that implements the <code>Aggregate<\/code> interface, and use the <code>Iterator<\/code> object to iterate the elements in the collection object. <\/li>\n\n\n\n<li><code>ConcreteAggregate<\/code> is a concrete implementation of the <code>Aggregate<\/code> interface that creates a <code>ConcreteIterator<\/code> object for iterating the collection.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">C# Iterator pattern example<\/h2>\n\n\n\n<p>Suppose you have a collection of calendar months from January to December, and you want to iterate through it in the sequence of Jan, Feb, Mar, &#8230; Dec.<\/p>\n\n\n\n<p>Additionally, if the fiscal month starts in April instead of January, you need to provide a way to iterate the months in the following sequence: Apr, May, &#8230; Dec, Jan, Feb, Mar.<\/p>\n\n\n\n<p>To achieve this kind of iteration, you can use the Iterator pattern. Here are the steps:<\/p>\n\n\n\n<p>First, define an <code>Iterator<\/code> interface that has methods for iterating months:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">IMonthIterator<\/span>\n{\n    <span class=\"hljs-keyword\">string<\/span> Current { <span class=\"hljs-keyword\">get<\/span>; }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">bool<\/span> <span class=\"hljs-title\">MoveNext<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Reset<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, create an <code>IAggregate<\/code> interface that defines a method for creating an <code>IMonthIterator<\/code> object:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">IAggregate<\/span>\n{\n    <span class=\"hljs-function\">IMonthIterator <span class=\"hljs-title\">CreateIterator<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Third, define the <code>Months<\/code> collection that implements the <code>IAggregate<\/code> interface:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Months<\/span>: <span class=\"hljs-title\">IAggregate<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">string<\/span>&#91;] _months = {\n        <span class=\"hljs-string\">\"Jan\"<\/span>,<span class=\"hljs-string\">\"Feb\"<\/span>,<span class=\"hljs-string\">\"Mar\"<\/span>,\n        <span class=\"hljs-string\">\"Apr\"<\/span>,<span class=\"hljs-string\">\"May\"<\/span>,<span class=\"hljs-string\">\"Jun\"<\/span>,\n        <span class=\"hljs-string\">\"Jul\"<\/span>,<span class=\"hljs-string\">\"Aug\"<\/span>,<span class=\"hljs-string\">\"Sep\"<\/span>,\n        <span class=\"hljs-string\">\"Oct\"<\/span>,<span class=\"hljs-string\">\"Nov\"<\/span>,<span class=\"hljs-string\">\"Dec\"<\/span>,\n    };\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> FiscalMonthStart { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; } = <span class=\"hljs-number\">1<\/span>;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> IMonthIterator <span class=\"hljs-title\">CreateIterator<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> MonthIterator(_months, FiscalMonthStart);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In the <code>Months<\/code> class:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <code>_months<\/code> private field holds an array of months from <code>Jan<\/code> to <code>Dec<\/code>. <\/li>\n\n\n\n<li>The <code>FiscalMonthStart<\/code> property defaults to 1, indicating that the fiscal month starts in January by default. <\/li>\n\n\n\n<li>The <code>CreateIterator()<\/code> method returns a new <code>MonthIterator<\/code> which is the concrete iterator of the <code>IMonthIterator<\/code> interface. The constructor of the <code>MonthIterator<\/code> accepts two arguments, the <code>_months<\/code> array, and the <code>FiscalMonthStart<\/code>.<\/li>\n<\/ul>\n\n\n\n<p>Fourth, define the <code>MonthIterator<\/code> class that implements the <code>IMonthIterator<\/code> interface:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MonthIterator<\/span>: <span class=\"hljs-title\">IMonthIterator<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> _index;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> _count = <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">string<\/span>&#91;] _months;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">int<\/span> _fiscalMonthStart;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">MonthIterator<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] months, <span class=\"hljs-keyword\">int<\/span> fiscalMonthStart<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (months.Length != <span class=\"hljs-number\">12<\/span>)\n        {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> ArgumentException(<span class=\"hljs-string\">\"The number of months is not 12\"<\/span>);\n        }\n\n        <span class=\"hljs-keyword\">if<\/span> (fiscalMonthStart &lt; <span class=\"hljs-number\">0<\/span> || fiscalMonthStart &gt; <span class=\"hljs-number\">12<\/span>)\n        {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> ArgumentOutOfRangeException(<span class=\"hljs-keyword\">nameof<\/span>(fiscalMonthStart));\n        }\n\n        _months = months;\n        _fiscalMonthStart = fiscalMonthStart;\n\n        _index = _fiscalMonthStart - <span class=\"hljs-number\">2<\/span>;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> Current\n    {\n        <span class=\"hljs-keyword\">get<\/span>\n        {\n            <span class=\"hljs-keyword\">if<\/span> (_index &lt; <span class=\"hljs-number\">0<\/span> || _index &gt; _months.Length)\n            {\n                <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IndexOutOfRangeException();\n            }\n            _count++;\n            <span class=\"hljs-keyword\">return<\/span> _months&#91;_index];\n        }\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">bool<\/span> <span class=\"hljs-title\">MoveNext<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (_count &gt;= <span class=\"hljs-number\">12<\/span>)\n        {\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\n        }\n\n        _index++;\n        <span class=\"hljs-keyword\">if<\/span> (_index == _months.Length)\n        {\n            _index = <span class=\"hljs-number\">0<\/span>;\n        }\n\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">true<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Reset<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        _count = <span class=\"hljs-number\">0<\/span>;\n        _index = _fiscalMonthStart - <span class=\"hljs-number\">2<\/span>;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In the <code>MonthIterator<\/code> class:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <code>_index<\/code> field holds the current position of the month in the <code>_months<\/code> array.<\/li>\n\n\n\n<li>The <code>_months<\/code> array stores an array of months from Jan to Dec. <\/li>\n\n\n\n<li>The <code>_count<\/code> field holds the number of months that have been iterated. Its values are from 1 to 12.  If you iterate all the months, the _count will be 12, and no more next element in the <code>_months<\/code> to return.<\/li>\n\n\n\n<li>The <code>_fiscalMonthStart<\/code> stores the month number that the fiscal month will start e.g. <code>_fiscalMonthStart<\/code> is 1, which means the fiscal month will start in January.<\/li>\n\n\n\n<li>The constructor validates the <code>_months<\/code> array to make sure that it has 12 elements and also ensures that the value of <code>fiscalMonthStart<\/code> is from 1 to 12.  It assigns <code>_months<\/code> and _<code>fiscalMonthStart<\/code> fields and initializes the <code>_index<\/code> field.<\/li>\n\n\n\n<li>The <code>Current<\/code> getter throws an <code>IndexOutOfRangeException<\/code> error if the <code>_index<\/code> is not in the valid range from 1 to 12, increases the <code>_count<\/code>, and returns the current element in the <code>_months<\/code> array based on the <code>_index<\/code>.<\/li>\n\n\n\n<li>The <code>MoveNext()<\/code> method returns false if the <code>_count<\/code> is greater than 12. Otherwise, it increases the <code>_index<\/code> by one and returns true. If the <code>_index<\/code> is the same as the length of the <code>_month<\/code> array, reset it to zero.<\/li>\n\n\n\n<li>The <code>Reset()<\/code> method resets the <code>_count<\/code> to zero and <code>_index<\/code> to <code>_fiscalMonthStart - 2<\/code>.<\/li>\n<\/ul>\n\n\n\n<p>Finally, create a program that uses the iterator to iterate over months with the fiscal month starting in Jan and April:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> months = <span class=\"hljs-keyword\">new<\/span> Months();\n\n        <span class=\"hljs-comment\">\/\/ fiscal month start in Jan by default<\/span>\n        Console.WriteLine(<span class=\"hljs-string\">\"Fiscal month start in January:\"<\/span>);\n        <span class=\"hljs-keyword\">var<\/span> iterator = months.CreateIterator();\n        <span class=\"hljs-keyword\">while<\/span> (iterator.MoveNext())\n        {\n            Console.Write(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{iterator.Current}<\/span> \"<\/span>);\n        }\n\n        Console.WriteLine();\n\n        <span class=\"hljs-comment\">\/\/ fiscal month start in April<\/span>\n        Console.WriteLine(<span class=\"hljs-string\">\"Fiscal month start in April:\"<\/span>);\n        months.FiscalMonthStart = <span class=\"hljs-number\">4<\/span>;\n\n        iterator = months.CreateIterator();\n        <span class=\"hljs-keyword\">while<\/span> (iterator.MoveNext())\n        {\n            Console.Write(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{iterator.Current}<\/span> \"<\/span>);\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">Fiscal month start in January:\nJan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\nFiscal month start in April:\nApr May Jun Jul Aug Sep Oct Nov Dec Jan Feb Mar<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Put it all together:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">IteratorPattern<\/span>;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">IMonthIterator<\/span>\n{\n    <span class=\"hljs-keyword\">string<\/span> Current {  <span class=\"hljs-keyword\">get<\/span>; }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">bool<\/span> <span class=\"hljs-title\">MoveNext<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Reset<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">IAggregate<\/span>\n{\n    <span class=\"hljs-function\">IMonthIterator <span class=\"hljs-title\">CreateIterator<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Months<\/span> : <span class=\"hljs-title\">IAggregate<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">string<\/span>&#91;] _months = {\n        <span class=\"hljs-string\">\"Jan\"<\/span>,<span class=\"hljs-string\">\"Feb\"<\/span>,<span class=\"hljs-string\">\"Mar\"<\/span>,\n        <span class=\"hljs-string\">\"Apr\"<\/span>,<span class=\"hljs-string\">\"May\"<\/span>,<span class=\"hljs-string\">\"Jun\"<\/span>,\n        <span class=\"hljs-string\">\"Jul\"<\/span>,<span class=\"hljs-string\">\"Aug\"<\/span>,<span class=\"hljs-string\">\"Sep\"<\/span>,\n        <span class=\"hljs-string\">\"Oct\"<\/span>,<span class=\"hljs-string\">\"Nov\"<\/span>,<span class=\"hljs-string\">\"Dec\"<\/span>,\n    };\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> FiscalMonthStart { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; } = <span class=\"hljs-number\">1<\/span>;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> IMonthIterator <span class=\"hljs-title\">CreateIterator<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> MonthIterator(_months, FiscalMonthStart);\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MonthIterator<\/span> : <span class=\"hljs-title\">IMonthIterator<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> _index;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> _count = <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">string<\/span>&#91;] _months;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">int<\/span> _fiscalMonthStart;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">MonthIterator<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] months, <span class=\"hljs-keyword\">int<\/span> fiscalMonthStart<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (months.Length != <span class=\"hljs-number\">12<\/span>)\n        {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> ArgumentException(<span class=\"hljs-string\">\"The number of months is not 12\"<\/span>);\n        }\n\n        <span class=\"hljs-keyword\">if<\/span> (fiscalMonthStart &lt; <span class=\"hljs-number\">0<\/span> || fiscalMonthStart &gt; <span class=\"hljs-number\">12<\/span>)\n        {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> ArgumentOutOfRangeException(<span class=\"hljs-keyword\">nameof<\/span>(fiscalMonthStart));\n        }\n\n        _months = months;\n        _fiscalMonthStart = fiscalMonthStart;\n\n        _index = _fiscalMonthStart - <span class=\"hljs-number\">2<\/span>;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> Current\n    {\n        <span class=\"hljs-keyword\">get<\/span>\n        {\n            <span class=\"hljs-keyword\">if<\/span> (_index &lt; <span class=\"hljs-number\">0<\/span> || _index &gt; _months.Length)\n            {\n                <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IndexOutOfRangeException();\n            }\n            _count++;\n            <span class=\"hljs-keyword\">return<\/span> _months&#91;_index];\n        }\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">bool<\/span> <span class=\"hljs-title\">MoveNext<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (_count &gt;= <span class=\"hljs-number\">12<\/span>)\n        {\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\n        }\n\n        _index++;\n        <span class=\"hljs-keyword\">if<\/span> (_index == _months.Length)\n        {\n            _index = <span class=\"hljs-number\">0<\/span>;\n        }\n\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">true<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Reset<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        _count = <span class=\"hljs-number\">0<\/span>;\n        _index = _fiscalMonthStart - <span class=\"hljs-number\">2<\/span>;\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Run<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> months = <span class=\"hljs-keyword\">new<\/span> Months();\n\n        <span class=\"hljs-comment\">\/\/ fiscal month start in Jan by default<\/span>\n        Console.WriteLine(<span class=\"hljs-string\">\"Fiscal month start in January:\"<\/span>);\n        <span class=\"hljs-keyword\">var<\/span> iterator = months.CreateIterator();\n        <span class=\"hljs-keyword\">while<\/span> (iterator.MoveNext())\n        {\n            Console.Write(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{iterator.Current}<\/span> \"<\/span>);\n        }\n\n        Console.WriteLine();\n\n        <span class=\"hljs-comment\">\/\/ fiscal month start in April<\/span>\n        Console.WriteLine(<span class=\"hljs-string\">\"Fiscal month start in April:\"<\/span>);\n        months.FiscalMonthStart = <span class=\"hljs-number\">4<\/span>;\n\n        iterator = months.CreateIterator();\n        <span class=\"hljs-keyword\">while<\/span> (iterator.MoveNext())\n        {\n            Console.Write(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{iterator.Current}<\/span> \"<\/span>);\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Implementing Iterator pattern in C# using IEnumerable and IEnumerator interfaces<\/h2>\n\n\n\n<p>C# supports the Iterator design pattern out of the box via the <code>IEnumerator<\/code> and <code>IEnumerable<\/code> interfaces. For the modern C# code, you should use the <code>IEnumerator&lt;T&gt;<\/code> and <code>IEnumerable&lt;T&gt;<\/code> instead.<\/p>\n\n\n\n<p>Also, C# allows you to iterate over the elements of a collection that implements the <code>IEnumerable<\/code>&lt;T&gt; interface using the <code><a href=\"https:\/\/csharptutorial.net\/csharp-tutorial\/csharp-foreach\/\">foreach<\/a><\/code> loop.<\/p>\n\n\n\n<p>In C#, an iterator is also called an enumerator. The <code>IEnumerable<\/code> interface has the <code>GetEnumerator()<\/code> method that returns an enumerator for iterating over elements of a collection. It is equivalent to the Aggregate interface. <\/p>\n\n\n\n<p>The <code>IEnumerator<\/code> interface has the <code>Current<\/code> property that returns the current element in the collection, the <code>MoveNext()<\/code> advances the enumerator to the next element of the collection, and the <code>Reset()<\/code> method sets the enumerator to its initial position. The <code>IEnumerator<\/code> is equivalent to the Iterator interface.<\/p>\n\n\n\n<p>The following example shows how to use the <code>IEnumable<\/code> and <code>IEnumerator<\/code> interfaces to implement the Iterator pattern.<\/p>\n\n\n\n<p>First, define the <code>Months<\/code> class that implements the <code>IEnumerable<\/code> interface. The <code>GetEnumerator()<\/code> method should return an instance of the <code>IEnumerator<\/code> interface. In this case, it returns an instance of the <code>MonthIterator<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Months<\/span> : <span class=\"hljs-title\">IEnumerable<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">string<\/span>&#91;] _months = {\n        <span class=\"hljs-string\">\"Jan\"<\/span>,<span class=\"hljs-string\">\"Feb\"<\/span>, <span class=\"hljs-string\">\"Mar\"<\/span>,\n        <span class=\"hljs-string\">\"Apr\"<\/span>,<span class=\"hljs-string\">\"May\"<\/span>, <span class=\"hljs-string\">\"Jun\"<\/span>,\n        <span class=\"hljs-string\">\"Jul\"<\/span>,<span class=\"hljs-string\">\"Aug\"<\/span>, <span class=\"hljs-string\">\"Sep\"<\/span>,\n        <span class=\"hljs-string\">\"Oct\"<\/span>,<span class=\"hljs-string\">\"Nov\"<\/span>, <span class=\"hljs-string\">\"Dec\"<\/span>,\n    };\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> FiscalMonthStart { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; } = <span class=\"hljs-number\">1<\/span>;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> IEnumerator <span class=\"hljs-title\">GetEnumerator<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> MonthIterator(_months, FiscalMonthStart);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, define the <code>MonthIterator<\/code> class that implements the <code>IEnumerator<\/code> interface:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MonthIterator<\/span> : <span class=\"hljs-title\">IEnumerator<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> _index;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> _count = <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">int<\/span> _fiscalMonthStart = <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">string<\/span>&#91;] _months;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">MonthIterator<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] months, <span class=\"hljs-keyword\">int<\/span> fiscalMonthStart<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (months.Length != <span class=\"hljs-number\">12<\/span>)\n        {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> ArgumentException(<span class=\"hljs-string\">\"The number of months is not 12\"<\/span>);\n        }\n\n        <span class=\"hljs-keyword\">if<\/span> (fiscalMonthStart &lt; <span class=\"hljs-number\">1<\/span> || fiscalMonthStart &gt; <span class=\"hljs-number\">12<\/span>)\n        {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> ArgumentOutOfRangeException(<span class=\"hljs-keyword\">nameof<\/span>(fiscalMonthStart));\n        }\n\n        _months = months;\n        _fiscalMonthStart = fiscalMonthStart;\n        _index = _fiscalMonthStart - <span class=\"hljs-number\">2<\/span>;\n    }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">object<\/span> Current\n    {\n        <span class=\"hljs-keyword\">get<\/span>\n        {\n            <span class=\"hljs-keyword\">if<\/span> (_index &lt; <span class=\"hljs-number\">0<\/span> || _index &gt; _months.Length)\n            {\n                <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IndexOutOfRangeException();\n            }\n            _count++;\n            <span class=\"hljs-keyword\">return<\/span> _months&#91;_index];\n        }\n    }\n\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">bool<\/span> <span class=\"hljs-title\">MoveNext<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (_count &gt;= <span class=\"hljs-number\">12<\/span>)\n        {\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\n        }\n\n        _index++;\n        <span class=\"hljs-keyword\">if<\/span> (_index == _months.Length)\n        {\n            _index = <span class=\"hljs-number\">0<\/span>;\n        }\n\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">true<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Reset<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        _count = <span class=\"hljs-number\">0<\/span>;\n        _index = _fiscalMonthStart - <span class=\"hljs-number\">2<\/span>;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Third, use the <code>foreach<\/code> to iterate the elements of the <code>Months<\/code> collection:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> months = <span class=\"hljs-keyword\">new<\/span> Months();\n\n        Console.WriteLine(<span class=\"hljs-string\">\"Fiscal month start in January:\"<\/span>);\n        <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> month <span class=\"hljs-keyword\">in<\/span> months)\n        {\n            Console.Write(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{month}<\/span> \"<\/span>);\n        }\n\n        Console.WriteLine();\n\n        <span class=\"hljs-comment\">\/\/ fiscal month start in April<\/span>\n        Console.WriteLine(<span class=\"hljs-string\">\"Fiscal month start in April:\"<\/span>);\n        months.FiscalMonthStart = <span class=\"hljs-number\">4<\/span>;\n        <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> month <span class=\"hljs-keyword\">in<\/span> months)\n        {\n            Console.Write(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{month}<\/span> \"<\/span>);\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">Fiscal month start <span class=\"hljs-keyword\">in<\/span> January:\nJan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\nFiscal month start <span class=\"hljs-keyword\">in<\/span> April:\nApr May Jun Jul Aug Sep Oct Nov Dec Jan Feb Mar<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Put it all together:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> System.Collections;\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">IteratorPattern<\/span>;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Months<\/span> : <span class=\"hljs-title\">IEnumerable<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">string<\/span>&#91;] _months = {\n        <span class=\"hljs-string\">\"Jan\"<\/span>,<span class=\"hljs-string\">\"Feb\"<\/span>, <span class=\"hljs-string\">\"Mar\"<\/span>,\n        <span class=\"hljs-string\">\"Apr\"<\/span>,<span class=\"hljs-string\">\"May\"<\/span>, <span class=\"hljs-string\">\"Jun\"<\/span>,\n        <span class=\"hljs-string\">\"Jul\"<\/span>,<span class=\"hljs-string\">\"Aug\"<\/span>, <span class=\"hljs-string\">\"Sep\"<\/span>,\n        <span class=\"hljs-string\">\"Oct\"<\/span>,<span class=\"hljs-string\">\"Nov\"<\/span>, <span class=\"hljs-string\">\"Dec\"<\/span>,\n    };\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> FiscalMonthStart { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; } = <span class=\"hljs-number\">1<\/span>;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> IEnumerator <span class=\"hljs-title\">GetEnumerator<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> MonthIterator(_months, FiscalMonthStart);\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MonthIterator<\/span> : <span class=\"hljs-title\">IEnumerator<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> _index;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> _count = <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">int<\/span> _fiscalMonthStart = <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">string<\/span>&#91;] _months;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">MonthIterator<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] months, <span class=\"hljs-keyword\">int<\/span> fiscalMonthStart<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (months.Length != <span class=\"hljs-number\">12<\/span>)\n        {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> ArgumentException(<span class=\"hljs-string\">\"The number of months is not 12\"<\/span>);\n        }\n\n        <span class=\"hljs-keyword\">if<\/span> (fiscalMonthStart &lt; <span class=\"hljs-number\">1<\/span> || fiscalMonthStart &gt; <span class=\"hljs-number\">12<\/span>)\n        {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> ArgumentOutOfRangeException(<span class=\"hljs-keyword\">nameof<\/span>(fiscalMonthStart));\n        }\n\n        _months = months;\n        _fiscalMonthStart = fiscalMonthStart;\n        _index = _fiscalMonthStart - <span class=\"hljs-number\">2<\/span>;\n    }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">object<\/span> Current\n    {\n        <span class=\"hljs-keyword\">get<\/span>\n        {\n            <span class=\"hljs-keyword\">if<\/span> (_index &lt; <span class=\"hljs-number\">0<\/span> || _index &gt; _months.Length)\n            {\n                <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IndexOutOfRangeException();\n            }\n            _count++;\n            <span class=\"hljs-keyword\">return<\/span> _months&#91;_index];\n        }\n    }\n\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">bool<\/span> <span class=\"hljs-title\">MoveNext<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (_count &gt;= <span class=\"hljs-number\">12<\/span>)\n        {\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\n        }\n\n        _index++;\n        <span class=\"hljs-keyword\">if<\/span> (_index == _months.Length)\n        {\n            _index = <span class=\"hljs-number\">0<\/span>;\n        }\n\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">true<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Reset<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        _count = <span class=\"hljs-number\">0<\/span>;\n        _index = _fiscalMonthStart - <span class=\"hljs-number\">2<\/span>;\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> months = <span class=\"hljs-keyword\">new<\/span> Months();\n\n        Console.WriteLine(<span class=\"hljs-string\">\"Fiscal month start in January:\"<\/span>);\n        <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> month <span class=\"hljs-keyword\">in<\/span> months)\n        {\n            Console.Write(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{month}<\/span> \"<\/span>);\n        }\n\n        Console.WriteLine();\n\n        <span class=\"hljs-comment\">\/\/ fiscal month start in April<\/span>\n        Console.WriteLine(<span class=\"hljs-string\">\"Fiscal month start in April:\"<\/span>);\n        months.FiscalMonthStart = <span class=\"hljs-number\">4<\/span>;\n        <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> month <span class=\"hljs-keyword\">in<\/span> months)\n        {\n            Console.Write(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{month}<\/span> \"<\/span>);\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use the Iterator pattern to define an interface for iterating elements of a collection.<\/li>\n\n\n\n<li>Use <code>IEnumerable&lt;T&gt;<\/code> and <code>IEnumerator&lt;T&gt;<\/code> interfaces to implement the iterator pattern in C#.<\/li>\n\n\n\n<li>Use <code>foreach<\/code> to iterate elements in a collection that implement the <code>IEnumerable&lt;T&gt;<\/code> interface.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"1724\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-iterator\/\"\n\t\t\t\tdata-post-title=\"C# Iterator\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"1724\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-iterator\/\"\n\t\t\t\tdata-post-title=\"C# Iterator\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summary: in this tutorial, you will learn about the C# iterator pattern and how to use it to define an interface that iterates the elements in a collection. Introduction to the C# Iterator design pattern The Iterator is a behavioral design pattern that allows you to define an interface for iterating elements of a collection [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1441,"menu_order":13,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1724","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1724","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/comments?post=1724"}],"version-history":[{"count":5,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1724\/revisions"}],"predecessor-version":[{"id":1864,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1724\/revisions\/1864"}],"up":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1441"}],"wp:attachment":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/media?parent=1724"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}