Paginate IEnumerable sequence I used the following to split sequence into batches:

source
    .Select((item, index) =&gt; new {Item = item, Index = index})
    .ToLookup(x =&gt; x.Index / batchSize, x =&gt; x.Item);


but it requires full materialization of the sequence - memory complexity could be high.

Are there anything ready to be used? I think there is nothing in MoreLinq for that.

Here is a custom solution I am trying now:

public static class Batch
{
    public static IEnumerable&lt;T[]&gt; Split&lt;T&gt;(this IEnumerable&lt;T&gt; source, int batchSize)
    {
        var it = source.GetEnumerator();
        for (var b = split(); b.Length &gt; 0; b = split())
            yield return b;

        T[] split() =&gt; Enumerable
            .Range(0, batchSize)
            .TakeWhile(i =&gt; it.MoveNext())
            .Select(i =&gt; it.Current)
            .ToArray();
    }
}
Since you mentioned morelinq in your question.  It does have the Batch method which is similar.  It's an IEnumerable&lt;IEnumerable&lt;TSource&gt;&gt; instead of IEnumerable&lt;TSource[]&gt; but if you look at the source code it's actually an IEnumerable of an array but you can't count on that as it's an implementation detail.  

The only issue I see with your implementation is that source.GetEnumerator() returns back IEnumerator&lt;T&gt; which implements IDisposable and should be wrapped in a using statement.