public static IEnumerable <IEnumerable <T> > Partition <T>(this IEnumerable <T> source, int chunkSize) { var enumeratorWithStatus = new EnumeratorWithStatus <T> { enumerator = source.GetEnumerator() }; while (enumeratorWithStatus.hasMore) { yield return(getChunk(enumeratorWithStatus, chunkSize).ToList()); } }
private static IEnumerable <T> getChunk <T>(EnumeratorWithStatus <T> enumeratorWithStatus, int chunkSize) { while (chunkSize > 0) { if (enumeratorWithStatus.enumerator.MoveNext()) { chunkSize--; yield return(enumeratorWithStatus.enumerator.Current); } else { enumeratorWithStatus.hasMore = false; yield break; } } }