using System; using System.Collections.Generic; using System.Linq; static class Program { public static void Main(string[] args) { var list1 = new int?[] { 1, 2, 3, 4, 5 }; var list2 = new int?[] { 3, 4, 5, 6, 7 }; var list3 = new int?[] { 6, 9, 9 }; var lockstep = LockStepSequences(new[] { list1, list2, list3 }); foreach (var step in lockstep) Console.WriteLine(string.Join("\t", step.Select(i => i.HasValue ? i.Value.ToString() : "null").ToArray())); } public static IEnumerable> LockStepSequences(this IEnumerable> sequences) { var iters = sequences .Select((s, index) => new { active=true, index, enumerator = s.GetEnumerator() }) .ToArray(); var isActive = iters.Select(it => it.enumerator.MoveNext()).ToArray(); var numactive = isActive.Count(flag => flag); try { while (numactive > 0) { T min = iters .Where(it => isActive[it.index]) .Min(it => it.enumerator.Current); var row = new T[iters.Count()]; for (int j = 0; j < isActive.Length; j++) { if (!isActive[j] || !Equals(iters[j].enumerator.Current, min)) continue; row[j] = min; if (!iters[j].enumerator.MoveNext()) { isActive[j] = false; numactive -= 1; } } yield return row; } } finally { foreach (var iter in iters) iter.enumerator.Dispose(); } } }