为了在巨大的阵列中轻松找到值,我想使用"查找" -Command of List。 问题是,现在它不是List,它是一个3D阵列。
这意味着,我需要将 double [,,] - 数组转换为
List<List<List<double>>> blabla
数组示例:
double[,,] myArray = new double[2,3,3];
看起来像下面那样:
myArray[1,:,:] = 1.11 1.12 1.13
1.21 1.22 1.23
1.31 1.32 1.33
myArray[2,:,:] = 2.11 2.12 2.13
2.21 2.22 2.23
2.31 2.32 2.33
这可以通过单线使用&#34; Cast&#34;命令?
由于
答案 0 :(得分:0)
double[, ,] array3D = new double[2, 3, 3] { { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }, { { 10, 11, 12 }, { 13, 14, 15 }, { 16, 17, 18 } } };
List<List<List<double>>> topLevel = new List<List<List<double>>>();
for (int a = 0; a < array3D.GetLength(0); a++)
{
List<List<double>> secondLevel = new List<List<double>>();
for (int b = 0; b < array3D.GetLength(1); b++)
{
List<double> thirdLevel = new List<double>();
for (int c = 0; c < array3D.GetLength(2); c++)
{
thirdLevel.Add(array3D[a, b, c]);
}
secondLevel.Add(thirdLevel);
}
topLevel.Add(secondLevel);
}
输出:
答案 1 :(得分:0)
不是一行,但Linq帮助:
var l = new List<List<List<double>>>(
Enumerable.Range(0, array3D.GetLength(0)).Select(i0 => new List<List<double>>(
Enumerable.Range(0, array3D.GetLength(1)).Select(i1 => new List<double>(
Enumerable.Range(0, array3D.GetLength(2)).Select(i2 => array3D[i0, i1, i2])
))
)));
我仍然会强调,这似乎更适合自定义类。我想到了Matrix,Sequence和Set这个名字......
答案 2 :(得分:0)
鉴于你的double[,,] myArray
,你可以这样做:
var blabla =
myArray
.Cast<double>()
.Select((v, n) => new
{
x = n / (myArray.GetLength(2) * myArray.GetLength(1)),
y = (n / myArray.GetLength(2)) % myArray.GetLength(1),
value = v,
})
.GroupBy(q => q.x)
.Select(q =>
q
.GroupBy(
w => w.y,
w => w.value)
.Select(e => e.ToList())
.ToList())
.ToList();
这会为您提供您正在寻找的List<List<List<Double>>>
。
所有人都在单行中!