 <p>The optimisation that would be nice is if on <code>Skip(k)</code> the first <code>.MoveNext</code> just sets the internal index to <code>k</code>, and I thought the JITter could do this, but it seems not to, for the versions I've tried.</p> <p>The code to be optimised is:</p> <pre><code>while (count &gt; 0 &amp;&amp; e.MoveNext()) count--; </code></pre> <p>from <a href="http://referencesource.microsoft.com/System.Core/System/Linq/Enumerable.cs.html#83ec6a20321060a1" rel="nofollow">SkipIterator</a> and:</p> <pre><code> public bool MoveNext() { if (_index &lt; _endIndex) { _index++; return (_index &lt; _endIndex); } return false; } </code></pre> <p>from <a href="http://referencesource.microsoft.com/mscorlib/system/array.cs.html#4864727bda517629" rel="nofollow">SZGenericArrayEnumerator</a>.</p> <p>(The reference source is 4.5.1, but reflector shows very similar code in 4.0.)</p>