【问题标题】:How to fill two dimensions of a 3D array in C#如何在 C# 中填充 3D 数组的二维
【发布时间】:2021-12-26 16:07:53
【问题描述】:

我正在处理 C# 中的多维数组,我想知道是否可以使用另一个二维数组填充 3 维数组的二维。我有两个数组:

byte[,,] thArray = new byte[1000, 1000, 1000];
byte[,] twArray = new byte[1000, 1000];

现在我需要做这样的事情:

thArray[,,0] = twArray;

【问题讨论】:

  • 您可以尝试使用 2D 数组数组 而不是 3D 数组:byte[][,] thArray = new byte[][,] {twArray};
  • @DmitryBychenko 实际上,我需要在循环中填充第三维。不仅用于初始化。
  • 好吧,你试了之后发生了什么?

标签: c# arrays .net multidimensional-array


【解决方案1】:

填充任何类型的数组都需要复制。所以简单的答案是编写一个双循环,将每个值从twArray 复制到thArray。其他答案已经显示了如何做到这一点。

不过,我可能会分享一些使用大型多维数组的经验。

对于 2D 数组,我更喜欢使用 1D 数组周围的包装器,而不是内置的多维数组。这使得一些操作更快,并允许使用 Buffer.BlockCopy 复制大段,并且在与其他系统交互时通常更容易使用。可以像 y*width + x 那样为值建立索引。

使用自定义类型还消除了在循环检查中调用.GetLength() 的风险,因为这种方法比检查常规属性要慢几倍。一个容易犯的错误,但会使循环变慢。

对于 3D 数组,您可以使用相同的方法,只需添加另一个维度。但根据我的经验,这往往比使用锯齿状数组要慢。所以我建议对 3D 数组使用 byte[][] myArray 之类的东西,并使用 myArray[z][y * width + x] 对其进行索引,最好使用一些可以执行所有这些索引的自定义类。

【讨论】:

    【解决方案2】:

    可以使用 2 个 for 循环将二维数组的值复制到 3 维数组,但保留 3 维数组 z-value 0:

    int height = twArray.GetLength(0);
    int width = twArray.GetLength(1);
    
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            thArray[i, j, 0] = twArray[i, j];
        }
    }
    

    【讨论】:

      【解决方案3】:

      是的,你可以在一个很好的旧 for 中做到这一点循环

       for (int x = 0; x < thArray.GetLength(0); ++x)
         for (int y = 0; y < thArray.GetLength(1); ++y)
           thArray[x, y, 0] = twArray[x, y];
      

      如果你想一次性分配,你可以使用byte[][,] thArray - 二维数组数组

       byte[][,] thArray = new byte[1000][,];
      
       thArray[0] = twArray;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-27
        • 2018-04-13
        • 2015-10-16
        • 2014-12-23
        • 1970-01-01
        • 1970-01-01
        • 2016-05-27
        • 2012-08-21
        相关资源
        最近更新 更多