将值分配给3D数组不起作用?

时间:2019-11-09 21:44:50

标签: c# arrays multidimensional-array

我有一个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
                    }
                }
            }

3 个答案:

答案 0 :(得分:1)

看起来,在声明中,您有一个3d的 int s(int[,,] cube)数组,这意味着对于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);
                }
            }
        }

答案 1 :(得分:0)

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

对于锯齿状的集合,我可以只使用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;
    }
  }
}

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

答案 2 :(得分:0)

类型

当您将锯齿状数组声明为new int[,,]时,您是在说:

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

索引

您的索引错误。在c#数组中,索引从零开始。

来自Arrays (C# Programming Guide)

  

阵列概述

     

一个数组具有以下属性:

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

由于这个原因,常规的for循环从0:for (int i = 0; i < 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)