C# 如何将二维数组 [] 粘贴到指定索引上的第二个二维数组 []

C# How to paste 2D array[,] onto second 2D array[,] on specified indexes

有没有比遍历它们更好(更简单)的方法将较小的数组[]粘贴到较大的数组[]?我的代码:

private void PasteRoomIntoTheMap(GameObject[,] room, (int, int) positionOnTheMap)
{
    (int, int) roomSize = (room.GetLength(0), room.GetLength(1));
    int roomsXAxesDimention = 0;
    int roomsYAxesDimention = 0;
    for (int i = positionOnTheMap.Item1; i <= positionOnTheMap.Item1 + roomSize.Item1; i++)
    {
        for (int j = positionOnTheMap.Item2; j <= positionOnTheMap.Item2 + roomSize.Item2; j++)
        {
            Map[i, j] = room[roomsXAxesDimention, roomsYAxesDimention];
            roomsYAxesDimention++;
        }
        roomsXAxesDimention++;
    }
}

(我还没有运行。可能会有一些错误,但我希望你能理解这个方法)

我希望拥有的代码:

Map [5...15, 2...5] = room[0...room.GetLength(0), 0...room.GetLength(1)]

简答:

更长的答案:

多维数组实际上是一维数组的包装器,带有一些特殊代码来处理索引等。但是它缺少一些有用的功能。

您或许可以通过使用 Array.Copy or blockCopy 复制整个列或行而不是逐项处理来稍微改进您的示例代码。如果您有很多项目需要复制,这可能有助于提高性能,但如果尺寸很小,则不太可能产生任何影响。

您可以通过创建类似 ArraySlice2D class 的内容来提供您想要的语法,这些内容引用原始二维数组以及您要复制的区域。但是您可能需要创建自己的包装器来提供索引运算符,或者创建扩展方法来执行此操作。也许像

public class My2DArray<T>{
    private T[,] array;
public ArraySlice2D<T> this[Range x, Range y]{
   get => new ArraySlice2D<T>(array, x, y);
   set {
       // Copy values from value.RangeX/Y to x/y ranges
   }
}

您也可以考虑编写自己的包含一维数组的二维数组 class。我发现这通常会使互操作性变得更容易,因为大多数系统都可以处理一维数组,但很少有人可以在不进行转换的情况下处理多维数组。

我不知道有什么捷径可以做到这一点,并且可能有许多稍微不同的用例,因此最合适的解决方案是实现您自己的功能。

然而,建议在您的方法中添加大小检查,这样您就不会最终索引大数组的不存在区域:

private bool ReplaceWithSubArray(int[,] array, int[,] subarray, (int x,int y) indices)
{
    if (array.GetLength(0) < subarray.GetLength(0) + indices.x ||
                array.GetLength(1) < subarray.GetLength(1) + indices.y)
    {
        // 'array' to small
        return false;
    }
    for (int x = 0; x <= subarray.GetLength(0); x++)
    {
        for (int y = 0; y <= subarray.GetLength(1); y++)
        {
            array[x + indices.x, y + indices.y] = subarray[x, y];
        }
    }
    return true;
}