C#-如何将值添加到3D数组?

时间:2019-05-20 16:26:44

标签: c# arrays

我正在使用Mapbox构建交互式地图,并想在特定区域绘制一个多边形,如图here所示。为此,我需要使用数据库中的X,Y和Z坐标动态填充3D数组。我要实现的数组结构是:

[
  [
    [
      [xCoordinate1, yCoordinate1, zCoordinate1],
      [xCoordinate2, yCoordinate2, zCoordinate2],
      [xCoordinate3, yCoordinate3, zCoordinate3]
    ]
  ]
]

我一直在尝试使用C#完成此任务。在我的应用程序中,我初始化了一个3D列表,如下所示:

List<List<List<List<double>>>> coordinates = new List<List<List<List<double>>>>();

接下来,我遍历数据库中的坐标,以便将它们添加到数组中:

foreach (var coordinate in Coordinates) {
  coordinates.Add({ coordinate.X, coordinate.Y, coordinate.Z })
}

但是,这不会在所需位置添加值,并引发IndexOutOfBounds异常。我还尝试过初始化数组,如下所示:

double[, , ,] coordinates = {
  { 
    { 
      { coordinate.X, coordinate.Y, coordinate.Z }, 
      { coordinate.X, coordinate.Y, coordinate.Z }, 
      { coordinate.X, coordinate.Y, coordinate.Z }
    }
  }
};

使用这种方法时,我也无法按照应格式化的方式格式化数组。有人可以告诉我如何使用复杂的3D阵列,以便获得所需的结构吗?

总结:

int[,,,] array3D = new int[,,,] { 
  { 
    {
      { 1, 2, 3 },
      { 4, 5, 6 } 
      //How can I add more here dynamically?
    }
  }
};

array3D[0, 0, 0, 3] = { 7, 8, 8 }; //This doesn't do the trick :(

2 个答案:

答案 0 :(得分:1)

您无法更改多维数组的大小,但这没关系,因为您的JSON确实代表了一个数组数组。

从(可扩展的)坐标列表开始

var coords = new List<double[]>
{
    new double[] { 1,2,3 },
    new double[] { 4,5,6 },
};
// later
coords.Add(new double[] { 7, 8, 9 });

然后转换为JSON结构以进行导出。您显示了一个由坐标数组(array)组成的数组。

var json = new double[][][][] {
    new double[][][] {
        coords.ToArray()
    }
};

这是恢复坐标的方式

foreach (var item in json[0][0])
{
    Debug.WriteLine($"Point=({item[0]}, {item[1]}, {item[2]})");
}

在输出窗口中,您看到

// Point=(1, 2, 3)
// Point=(4, 5, 6)
// Point=(7, 8, 9)

答案 1 :(得分:0)

如果我理解正确,那么您将仅获得2D列表,其中第一个列表包含坐标集(即(x,y,z)),而第二个列表仅包含一堆第一列表,如下所示:

List<List<double>> coords = new List<List<double>>();
coords.Add(new List<double> { 24, 54, 46 });
coords.Add(new List<double> { 32, 45, 48 });
Console.WriteLine(coords[1][1]);
//Outputs 45.
//Note: xCoord = 24, yCoord = 54, zCoord = 46 in the first list entry

您可以将其作为单独的方法或扩展方法,在其中将坐标作为参数传递。也可以遍历列表以获取特定的x,y或z坐标(如果需要在代码中进行搜索)。