在C#中将3D数组转换为List

时间:2014-09-01 01:44:50

标签: c# multidimensional-array casting

为了在巨大的阵列中轻松找到值,我想使用"查找" -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;命令?

由于

3 个答案:

答案 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);
        }

输出: enter image description here

答案 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>>>

所有人都在单行中!