2014-09-01 36 views
1

为了在一个巨大的数组中容易地找到值,我想使用List的“find”命令。 问题是,现在它不是一个List,它是一个3D数组。将3D阵列转换为C中的列表#

这意味着,我需要转换我双[,,] - 阵列到阵列的

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 

这可以通过一个单线程完成,以某种方式使用“C ast“命令?

谢谢

+0

你能添加一个样本数组吗 – Seminda 2014-09-01 01:54:56

+0

多维数组在纯数学以外的用途很少,你想完成什么? – Mitch 2014-09-01 02:13:22

+0

如果可能的话,如果可能的话,确实很难得到一个单线程而不创建自己的方法并调用它,但我不认为这就是你的意思 – MarcinJuraszek 2014-09-01 02:21:32

回答

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

而且都在一个班轮!

+0

很好,谢谢 – Krus 2014-09-01 05:05:17

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

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]) 
     )) 
    ))); 

我还是要强调,这似乎有什么东西这将是更适合到一个自定义类。名称矩阵,顺序和定浮现在脑海中......