如何使用LINQ在2D集合中转换尺寸?

考虑以下结构:

IEnumerable<IEnumerable> collection = new[] { new [] {1, 2, 3}, new [] {4, 5, 6}, new [] {7, 8, 9} }; 

如何枚举此集合以便获取由第一项,第二项等组成的IEnumerable集合?

也就是说,{1,4,7},{2,5,8},……

(虽然我选择的实现是int[]对象,但假设你只有IEnumerablefunction。谢谢。)

这是一种使用生成器而不是递归的方法。 arrays构造也较少,因此可能更快,但这完全是猜想。

 public static IEnumerable> Transpose( this IEnumerable> @this) { var enumerators = @this.Select(t => t.GetEnumerator()) .Where(e => e.MoveNext()); while (enumerators.Any()) { yield return enumerators.Select(e => e.Current); enumerators = enumerators.Where(e => e.MoveNext()); } } 

代码信用在这里 (未经测试,但看起来很好)。

 public static class LinqExtensions { public static IEnumerable> Transpose(this IEnumerable> values) { if (!values.Any()) return values; if (!values.First().Any()) return Transpose(values.Skip(1)); var x = values.First().First(); var xs = values.First().Skip(1); var xss = values.Skip(1); return new[] {new[] {x} .Concat(xss.Select(ht => ht.First()))} .Concat(new[] { xs } .Concat(xss.Select(ht => ht.Skip(1))) .Transpose()); } } 
 //输入:转置[[1,2,3],[4,5,6],[7,8,9]]
 //输出:[[1,4,7],[2,5,8],[3,6,9]]
 var result = new [] {new [] {1,2,3},new [] {4,5,6},new [] {7,8,9}}。Transpose();     

只需我的2美分In pure linq:

  var transpond = collection.First().Select((frow,i)=>collection.Select(row=>row.ElementAt(i))); 

或者有一些不成熟:

 var r1 = collection.First().Select((frow, i) => collection.Select(row => row.ToArray()[i])); 

如果保证所有元素的长度相同,则可以执行以下操作:

 IEnumerable> Transpose(IEnumerable> collection) { var width = collection.First().Count(); var flattened = collection.SelectMany(c => c).ToArray(); var height = flattened.Length / width; var result = new int[width][]; for (int i = 0; i < width; i++) { result[i] = new int[height]; for (int j = i, k = 0; j < flattened.Length; j += width, k++) result[i][k] = flattened[j]; } return result; }