title: List<IEnumerator>.All(e => e.MoveNext()) doesn't move my enumerators on
body: <p>I'm trying to track down a bug in our code. I've boiled it down to the snippet below. In the example below I have a grid of ints (a list of rows), but I want to find the indexes of the columns that have a 1. The implementation of this is to create an enumerator for each row and step through each column in turn by keeping the enumerators in step. </p>
  
  <pre><code>class Program
  {
      static void Main(string[] args)
      {
          var ints = new List&lt;List&lt;int&gt;&gt; {
              new List&lt;int&gt; {0, 0, 1},    // This row has a 1 at index 2
              new List&lt;int&gt; {0, 1, 0},    // This row has a 1 at index 1
              new List&lt;int&gt; {0, 0, 1}     // This row also has a 1 at index 2
          };
          var result = IndexesWhereThereIsOneInTheColumn(ints);
  
          Console.WriteLine(string.Join(", ", result)); // Expected: "1, 2"
          Console.ReadKey();
      }
  
  
      private static IEnumerable&lt;int&gt; IndexesWhereThereIsOneInTheColumn(
          IEnumerable&lt;List&lt;int&gt;&gt; myIntsGrid)
      {
          var enumerators = myIntsGrid.Select(c =&gt; c.GetEnumerator()).ToList();
  
          short i = 0;
          while (enumerators.All(e =&gt; e.MoveNext())) {
              if (enumerators.Any(e =&gt; e.Current == 1))
                  yield return i;
              i++;
  
              if (i &gt; 1000)
                  throw new Exception("You have gone too far!!!");
          }
      }
  
  }
  </code></pre>
  
  <p>However I have noticed that <code>MoveNext()</code> is not remembered each time around the <code>while</code> loop. <code>MoveNext()</code> <em>always</em> returns true, and <code>Current</code> is <em>always</em> 0. Is this a purposeful feature of Linq to make it more side effect free?</p>
  
  <p>I noticed that this works:</p>
  
  <pre><code>    private static IEnumerable&lt;int&gt; IndexesWhereThereIsOneInTheColumn(
          IEnumerable&lt;List&lt;int&gt;&gt; myIntsGrid)
      {
          var enumerators = myIntsGrid.Select(c =&gt; 
              c.ToArray().GetEnumerator()).ToList(); // added ToArray() 
  
          short i = 0;
          while (enumerators.All(e =&gt; e.MoveNext())) {
              if (enumerators.Any(e =&gt; (int)e.Current == 1)) // added cast to int
                  yield return i;
              i++;
          }
      }
  </code></pre>
  
  <p>So is this just a problem with List?</p>