我有一个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
}
}
}
答案 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.Count
或List.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[,,]
时,您是在说:
[,,]
)和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个三元组的值,则需要一个(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)