在没有迭代的情况下,如何在包装时移动对象数组?

Myt*_*ics 2 c# jagged-arrays

我必须感到厌倦,因为这是在逃避我,感觉它应该非常简单,所以请放轻松我.

如果A,B和C都是内存中的类,则数组是元素0-2:

[0] = A
[1] = B
[2] = C
Run Code Online (Sandbox Code Playgroud)

我想移动数组,使其变为:

[0] = C
[1] = A
[2] = B
Run Code Online (Sandbox Code Playgroud)

我希望能够向任何一个方向前进,但我想如果有人能指出我如何在一个方向上做到这一点我可以找到另一个方向.

编辑:我想应该提一下,如果可能的话,我需要这个没有迭代.

编辑2:这是伪无限地形的3D游戏.数组中的每个对象都是地形数据块.我想要移动它们,因为它们包含非常大的锯齿状阵列,每个阵列都有大量数据.当玩家移动时,我会有地形滑动(进入/退出)内存.我从未考虑过仅使用array.copy移动数组然后完全重建下一系列块的性能.

因此,为了消除这个相对较小的性能问题,我想按照所描述的方式使用包装来移动数组,而不是通过重新分配内存来重建整个下一系列的块,我将重新使用复制时提到的巨大的锯齿状数组将默认值放入其中而不是完全重新初始化它们.

为了踢,所以你可以看到我以前在做什么:

public void ShiftChunks(strVector2 ChunkOffset) {
            while (ChunkOffset.X < 0) {
                Array.Copy(Chunks, 0, Chunks, 1, Chunks.Length - 1);

                for (int X = 1; X < maxChunkArraySize; X++)
                    for (int Z = 0; Z < maxChunkArraySize; Z++) 
                        Chunks[X][Z].SetArrayPosition(X, Z);

                Chunks[0] = new clsChunk[maxChunkArraySize];

                for (int Z = 0; Z < maxChunkArraySize; Z++) 
                    Chunks[0][Z] = new clsChunk(0, Z);

                ChunkOffset.X++;
            }

            while (ChunkOffset.X > 0) {
                Array.Copy(Chunks, 1, Chunks, 0, Chunks.Length - 1);

                for (int X = 0; X < maxChunkArraySize - 1; X++)
                    for (int Z = 0; Z < maxChunkArraySize; Z++) 
                        Chunks[X][Z].SetArrayPosition(X, Z);

                Chunks[maxChunkArraySize - 1] = new clsChunk[maxChunkArraySize];

                for (int Z = 0; Z < maxChunkArraySize; Z++) 
                    Chunks[maxChunkArraySize - 1][Z] = new clsChunk(maxChunkArraySize - 1, Z);

                ChunkOffset.X--;
            }

            while (ChunkOffset.Z < 0) {
                for (int X = 0; X < maxChunkArraySize; X++) {
                    Array.Copy(Chunks[X], 0, Chunks[X], 1, Chunks[X].Length - 1);
                    for (int Z = 1; Z < maxChunkArraySize; Z++) 
                        Chunks[X][Z].SetArrayPosition(X, Z);

                    Chunks[X][0] = new clsChunk(X, 0);
                }
                ChunkOffset.Z++;
            }

            while (ChunkOffset.Z > 0) {
                for (int X = 0; X < maxChunkArraySize; X++) {
                    Array.Copy(Chunks[X], 1, Chunks[X], 0, Chunks[X].Length - 1);

                    for (int k = 0; k < maxChunkArraySize - 1; k++) 
                        Chunks[X][k].SetArrayPosition(X, k);

                    Chunks[X][maxChunkArraySize - 1] = new clsChunk(X, maxChunkArraySize - 1);
                }
                ChunkOffset.Z--;
            }
        }
Run Code Online (Sandbox Code Playgroud)

如果有人想就如何更好地做到这一点或如何进一步优化代码发表意见,请随时告诉我.

Mat*_*ias 5

static void Rotate<T>(T[] source)
{
  var temp = source[source.Length - 1];
  Array.Copy(source, 0, source, 1, source.Length - 1);
  source[0] = temp;
}
Run Code Online (Sandbox Code Playgroud)