using System.Collections.Generic;
static int[][] data = new int[][] {
new int[]{ 5, 10, 33, 45 },
new int[]{ 3, 23, 44, 50, 700 },
static int[] expectedResult = new int[] { 5, 10, 33, 45, 3, 23, 44, 50, 700, 7, 55, 105 };
public class MoreComplicatedArray
public const int BeginningResumeToken = 0;
public const int FinishedResumeToken = -1;
public MoreComplicatedArray(int[] data)
public (int[], int) GetItems(int resumeToken, int pageSize)
return (arrayData.AsSpan(resumeToken, Math.Min(pageSize, arrayData.Length-resumeToken)).ToArray(),
resumeToken+pageSize <= arrayData.Length ? resumeToken+pageSize : -1);
static (int[], string) MoreComplicatedEnumerateWithResume(MoreComplicatedArray[] data, int batchSize, string resumeToken)
List<int> toReturn = new List<int>();
int[] resumeInts = string.IsNullOrEmpty(resumeToken) ? new int[] {0, MoreComplicatedArray.BeginningResumeToken}
: resumeToken.Split(':').Select( t => int.Parse(t)).ToArray();
for(int i= 0; i < data.Length; i++)
int arrayResume = resumeInts[0] == i ? resumeInts[1] : MoreComplicatedArray.BeginningResumeToken;
while(arrayResume != MoreComplicatedArray.FinishedResumeToken)
(getData, arrayResume) = data[i].GetItems(arrayResume, 5);
toReturn.AddRange(getData);
return (toReturn.ToArray(), null);
public static void Main()
List<int> withResume = new List<int>();
MoreComplicatedArray[] complicatedData = data
.Select( ar => new MoreComplicatedArray(ar))
(result, resume) = MoreComplicatedEnumerateWithResume(complicatedData, pageSize, resume);
Console.WriteLine($"{string.Join(',', result)}, {resume}");
withResume.AddRange(result);
if(resume == null) break;
Console.WriteLine($"Hit exception {e}");
Console.WriteLine($"{string.Join(',', withResume.ToArray())}");
bool withResumeWorksProperly = Enumerable.SequenceEqual(expectedResult, withResume.ToArray());
Console.WriteLine($"EnumerateAllWithResume successful: {withResumeWorksProperly}");