c# - 如何创建一个在其值之间具有偏移量的数组

时间:2015-03-30 19:45:09

标签: c# arrays

我真的不知道这叫什么。

我有一个地图生成器对象,以及生成顶点的东西。我想我可以提高性能,如果我使用的地图大小为4的数组,因为每个瓷砖有4个边。

基本上,我想要的是:

array[0] = value.w
array[1] = value.x
array[2] = value.y
array[3] = value.z

array[4] = empty
array[5] = empty
array[6] = empty
array[7] = empty

假设我有一张32x32的地图。 32x32 = 1024. 1024块大小为32x32。我现在有这个:

int[] myValArray = new int[4096];
for (int i = 0; i < 32; i++)
{
    for (int j = 0; j < 32; j++)
    {

        myValArray[i * j] = 0;
        myValArray[i * j + 1] = 1;
        myValArray[i * j + 2] = 2;
        myValArray[i * j + 3] = 3;
    }
}

然而,这不会奏效。我究竟做错了什么?在阵列中获得偏移的最佳方法是什么?

我尝试了不同的方法,但没有一种方法可行。如:     [i * j * 1]     [i * j * 4]     [i * j + 4]

3 个答案:

答案 0 :(得分:0)

您需要在循环之外初始化myValArray,否则每次都会重置。

如果要为每四个元素分配值,则只需要一个for循环。每次只增加4:

int[] myValArray = new int[4096];
for (int i = 0; i < 4092; i = i + 4)
{
    myValArray[i] = 0;
    myValArray[i + 1] = 1;
    myValArray[i + 2] = 2;
    myValArray[i + 3] = 3;
}

答案 1 :(得分:0)

你的索引都搞砸了。我假设您要考虑&#34;行&#34;一组32组4个坐标(128个条目)的连续组。

您当前的代码未正确初始化每一行。看看这个内循环:

for (int j = 0; j < 32; j++)
{
    myValArray[i * j] = 0;
    myValArray[i * j + 1] = 1;
    myValArray[i * j + 2] = 2;
    myValArray[i * j + 3] = 3;
}

当i = 0时,您生成的[0 * j + 1]始终为1。您经常在索引0, 1, 2, 3上分配超过32次。

同样,对于i = 1,您在第一次迭代时生成索引(0, 1, 2, 3),然后(1, 2, 3, 4)然后(2, 3, 4, 5) ...

更改此选项以实际利用32x32阵列的设置。

for (int j = 0; j < 32; j++)
{
    int rowOffset = (i * 32 * 4);
    int columnOffset = (j * 4);
    myValArray[rowOffset + columnOffset + 0] = 0;
    myValArray[rowOffset + columnOffset + 1] = 1;
    myValArray[rowOffset + columnOffset + 2] = 2;
    myValArray[rowOffset + columnOffset + 3] = 3;
}

这是一个.NET fiddle,展示了您的索引是如何出错的。

如果您决定将4个值组合到一个对象中,则不需要*4

答案 2 :(得分:-1)

删除int [] myValArray = new int [4096];到循环的外面 除了最后一次更改之外,您将丢失所做的任何更改,因为它每次都会重新创建。