我有一个二维数组
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
如何有效地做到这一点?
答案 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