// Two versions of the Transpose operation based on // ZipList idiom using IEnumerable<T>. One version is written // directly and the other one uses LINQ syntax with 'join' #region Transpose from the blog post static IEnumerable <IEnumerable <T> > Transpose2 <T>(this IEnumerable <IEnumerable <T> > matrix) { if (matrix.Count() == 0) { return(ZipEnumerable.Return(Enumerable.Empty <T>())); } else { return (ZipEnumerable. Merge(matrix.First(), Transpose(matrix.Skip(1))). Select(tuple => Enumerable.Concat(new[] { tuple.Item1 }, tuple.Item2))); } }