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 {index, enumerator = s.GetEnumerator()}) .Where(it => it.enumerator.MoveNext()) .ToArray(); try { for(var active = iters.ToList(); active.Any();) { T min = active.Min(it => it.enumerator.Current); var corresponding = active.Where(it => Equals(it.enumerator.Current, min)); yield return iters.Select((el, i) => corresponding.Any(it => it.index == i) ? el.enumerator.Current : default(T)); active = active.Except(corresponding.Where(it => !it.enumerator.MoveNext())).ToList(); } } finally { foreach (var iter in iters) iter.enumerator.Dispose(); } } }