【问题标题】:assigning value to 3D array doesn't work?为 3D 数组赋值不起作用?
【发布时间】:2019-11-09 21:44:50
【问题描述】:

我有一个 3d 数组: int[,,] cube = new int[10, 10, 10];

认为赋值的方式是这样的:

for(int i = 1; i < 11; i++)
            {
                for(int j = 1; j < 11; j++)
                {
                    for(int k = 1; k < 11; k++)
                    {
                        cube[i, j, k] = [i, j, k]; // Goofed up part
                    }
                }
            }

【问题讨论】:

  • 我们不知道您的问题是什么,但我认为代码会引发索引超出范围异常。数组索引不是从一开始的,所以不要从一迭代到十。像这样从零迭代到九:for (int i = 0; i &lt; 10; i++).
  • 另外,我不知道你想用[i, j, k]做什么。您是否尝试添加另一个数组?
  • 正如大家所指出的,C# 数组是从零开始的。 N 个元素的数组从 0 索引到 N-1。典型的for 循环写成for(var i = 0; i &lt; arrayLength; ++i)
  • 如果你真的想在一个三维数组的每个元素中存储三个坐标,你需要Point3D[,,]或类似的东西。

标签: c# arrays multidimensional-array


【解决方案1】:

我个人讨厌使用多维数组。

对于锯齿状集合,我可以只使用Array.CountList.Lenght 或类似的值作为for 循环的边界。它们需要做更多的初始化工作,但通常值得付出努力。在您的情况下,无论如何您都在执行初始化循环。

至于问题:

正如 CodeCharmander 指出的那样,您的索引是错误的。在 C# 集合中,索引从 0 开始。长度/计数为 10 的数组或列表的地址为 0、1、2 ... 8、9。在 i=1、j=1 时会出现越界异常, k=10。

当然,您需要将单个 int 值分配给 int[] 元素。 [i, j, k] 不是这样。索引的简单乘积是我首先想到的。

试试这个代码:

for(int i = 0; i < 10; i++)
{
  for(int j = 0; j < 10; j++)
  {
    for(int k = 0; k < 10; k++)
    {
      cube[i, j, k] = i*j*k;
    }
  }
}

您可能希望将常数 10 替换为 cube.GetLength(0)(数字是您想要的长度)。

【讨论】:

    【解决方案2】:

    类型

    当您将锯齿状数组声明为 new int[,,] 时,您的意思是:

    1. 有 3 个维度 ([,,]),并且
    2. 每个元素都是一个数字 (int)。

    索引

    您的索引不正确。在 c# 中,数组索引是从零开始的。

    来自Arrays (C# Programming Guide)

    阵列概览

    数组具有以下属性:

    • (...)
    • 数组索引为零:具有 n 个元素的数组索引从 0 到 n-1。

    因此,传统的 for 循环从 0 开始:for (int i = 0; i &lt; N; i++),如果您需要将数字 1-10 作为值,则使用 i+1

    var array = new int[10];
    
    for (int i = 0; i < 10; i++)
    {
       array[i] = i + 1;
    }
    // The array contains numbers 1..10;
    

    示例

    这是一个创建 3 种不同类型的立方体的示例。

    const int N = 10;
    var cube1 = new int[N, N, N]; // Each element can hold 3 numbers
    var cube2 = new (int, int, int)[N, N, N];// Each element can hold 3 numbers
    var cube3 = new System.Drawing.Color[N, N, N];// Each element is a color and can hold 4 numbers
    
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            for (int k = 0; k < N; k++)
            {
                cube1[i, j, k] = i * 100 + j * 10 + k; // Some number
                cube2[i, j, k] = (i+1, j+1, k+1);
                cube3[i, j, k] = System.Drawing.Color.FromArgb(red: i*20, green: j*20, blue: k*20);
            }
    
        }
    }
    
    Console.WriteLine(cube1[0,0,0]);
    Console.WriteLine(cube1[N-1,N-1,N-1]);
    Console.WriteLine(cube2[0,0,0]);
    Console.WriteLine(cube2[N-1,N-1,N-1]);
    Console.WriteLine(cube3[0,0,0]);
    Console.WriteLine(cube3[N-1,N-1,N-1]);
    

    输出

    0
    999
    (1, 1, 1)
    (10, 10, 10)
    Color [A=255, R=0, G=0, B=0]
    Color [A=255, R=180, G=180, B=180]
    

    10*3 个数字的数组

    如果您希望存储 10 个三元组值,那么您需要一个 (int,int,int) 的一维数组。

    var array = new (int, int, int)[10];
    for (int i = 0; i < 10; i++)
    {
        var x = i + 1;
        array[i] = (x * 100, x * 10, x);
    }
    
    Console.WriteLine(array[0]);
    Console.WriteLine(array[10 - 1]);
    

    输出

    (100, 10, 1)
    (1000, 100, 10)
    

    【讨论】:

      【解决方案3】:

      看,在你的声明中,你有一个 ints (int[,,] cube) 的 3d 数组,这意味着对于 i、j 和 k 的每个组合,你可以分配一个 int

      正确的做法是:

      cube[i, j, k] = a;
      

      a 是一个整数

      或者,您可以将数组的类型更改为其他类型,

      编辑

      如果您希望数组中的每个单元格都存储自己的坐标,您可以将类型更改为ValueTuple

      最终代码如下所示:

              var cube = new ValueTuple<int,int,int>[10, 10, 10];
      
              for (int i = 0; i < 10; i++)
              {
                  for (int j = 0; j < 10; j++)
                  {
                      for (int k = 0; k < 10; k++)
                      {
                          cube[i, j, k] = (i, j, k);
                      }
                  }
              }
      

      【讨论】:

      • 不,我希望第 i 个、第 j 个和第 k 个位置是 i、j 和 k。我没有收到错误
      • 我的索引超出范围异常..知道为什么吗?
      • 这是因为您创建的 3D 数组有足够的空间容纳每个维度 10 个值,在 C# 中数组枚举从 0 开始,所以我们得到了从 0 到 9 的索引,但是这里:` for (int k = 1; k
      • 这会抛出越界异常,顺便说一句。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 2021-03-16
      • 1970-01-01
      • 2010-12-13
      • 2022-11-17
      • 1970-01-01
      相关资源
      最近更新 更多