title: C# "Generator" Method
body: <p>I come from the world of Python and am trying to create a "generator" method in C#. I'm parsing a file in chunks of a specific buffer size, and only want to read and store the next chunk one at a time and yield it in a <code>foreach</code> loop. Here's what I have so far (simplified proof of concept):</p>
  
  <pre><code>class Page
  {
      public uint StartOffset { get; set; }
      private uint currentOffset = 0;
  
      public Page(MyClass c, uint pageNumber)
      {
          uint StartOffset = pageNumber * c.myPageSize;
  
          if (StartOffset &lt; c.myLength)
              currentOffset = StartOffset;
          else
              throw new ArgumentOutOfRangeException("Page offset exceeds end of file");
  
          while (currentOffset &lt; c.myLength &amp;&amp; currentOffset &lt; (StartOffset + c.myPageSize))
              // read data from page and populate members (not shown for MWE purposes)
              . . .
      }
  }
  
  class MyClass
  {
      public uint myLength { get; set; }
      public uint myPageSize { get; set; }
  
      public IEnumerator&lt;Page&gt; GetEnumerator()
      {
          for (uint i = 1; i &lt; this.myLength; i++)
          {
              // start count at 1 to skip first page
              Page p = new Page(this, i);
              try
              {
                  yield return p;
              }
              catch (ArgumentOutOfRangeException)
              {
                  // end of available pages, how to signal calling foreach loop?
              }
          }
      }
  }
  </code></pre>
  
  <p>I know this is not perfect since it is a minimum working example (I don't allow many of these properties to be set publicly, but for keeping this simple I don't want to type private members and properties). </p>
  
  <p>However, <strong>my main question</strong> is how do I let the caller looping over MyClass with a foreach statement know that there are no more items left to loop through? Is there an exception I throw to indicate there are no elements left?</p>