如何在每行上转置具有随机长度的2D数组?

时间:2018-12-24 09:20:20

标签: c#

我有一个二维数组

var arr= new List<double[]>();

内容:

1   2   3
4   3   7   
7   8   9   10
11  

我想将其像矩阵一样转置为:

1   4   7   11
2   3   8   
3   7   9   
        10  

然后将10移到第一个,就像:

1   4   7   11
2   3   8   
3   7   9   
10          

如何有效地做到这一点?

1 个答案:

答案 0 :(得分:4)

由于无论如何我们都必须“垂直”遍历所有数组,所以我严重怀疑它的嵌套嵌套效率会更高。

您可以找到最长的数组,并使用带有接受索引的重载的Linq data.Where来使用

.Select

或者用旧的for循环做同样的事情:

var arr = new List<double[]>();
arr.Add(new double[] { 1, 2, 3});
arr.Add(new double[] { 4, 3, 7 });
arr.Add(new double[] { 7, 8, 9, 10 });
arr.Add(new double[] { 11 });

var longestArr = arr.OrderByDescending(a => a.Length).First();
var result = longestArr.Select((_, i) => arr.Where(a => a.Length > i).Select(a => a[i]).ToArray()).ToList();

foreach (var _ in result)
{
   foreach (var element in _)
   {
      Console.Write(element + " ");
   }
   Console.WriteLine();
}

两者的输出是:

var longestArrLength = arr.Max(a => a.Length);
var result2 = new List<double[]>(arr.Count);

for (int i = 0; i < longestArrLength; i++)
{
   result2.Add(arr.Where(a => a.Length > i).Select(a => a[i]).ToArray());
}

这里是DotNetFiddle