C# C语言中三维数组到列表的转换
为了方便地在一个巨大的数组中查找值,我想使用列表的find命令。 问题是,现在它不是一个列表,而是一个3D阵列 这意味着,我需要将我的双[,]-数组转换为 然后可以如下所示:C# C语言中三维数组到列表的转换,c#,multidimensional-array,casting,C#,Multidimensional Array,Casting,为了方便地在一个巨大的数组中查找值,我想使用列表的find命令。 问题是,现在它不是一个列表,而是一个3D阵列 这意味着,我需要将我的双[,]-数组转换为 然后可以如下所示: 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
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
这可以通过一行程序以某种方式使用Cast命令来完成吗
谢谢你,你能行。您必须循环项目并获得结果。检查示例代码
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);
}
输出:
不是一行,但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])
))
)));
我仍然要强调,这似乎更适合定制类。您会想到名称矩阵、序列和集合…如果使用双[,]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();
这将为您提供您要查找的列表
所有的一切都在一行 你能添加一个示例数组吗多维数组除了纯数学之外几乎没有什么用途,你想做什么?如果可能的话,如果不创建自己的方法并调用它,要得到一个单行数组将非常困难,但我认为你不是这么想的meant@Mitch实际上我用它来优化算法,这是基于数学的。但我经常需要找到一些值或检查这个数组的整行,使用列表要容易得多。但是,如果没有简单的转换可能性,我可能会从多维数组更改为列表:谢谢您的支持help@MarcinJuraszek-接受挑战!请看我的答案-
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])
))
)));
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();