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;
}
有没有比遍历它们更好(更简单)的方法将较小的数组[]粘贴到较大的数组[]?我的代码:
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;
}