Как я мог выполнить копирование одного массива с зубцами в другой? Например, у меня есть массив 5x7:

0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0

И массив 4x3:

0,1,1,0
1,1,1,1
0,1,1,0

Я хотел бы иметь возможность указать конкретную начальную точку, такую ​​как (1,1), на моем нулевом массиве и скопировать мой второй массив поверх него, чтобы получить такой результат, как:

0, 0, 0, 0, 0, 0, 0
0, 0, 1, 1, 0, 0, 0
0, 1, 1, 1, 1, 0, 0
0, 0, 1, 1, 0, 0, 0
0, 0, 0, 0, 0, 0, 0

Как лучше всего это сделать?

3
George Johnston 31 Мар 2010 в 05:27
2
Ваши массивы всегда прямоугольные? Если да, то почему бы не использовать прямоугольный массив вместо зубчатого массива?
 – 
Mark Byers
31 Мар 2010 в 05:31
Наблюдение - оба примера массивов прямоугольные.
 – 
James Kolpack
31 Мар 2010 в 05:36

2 ответа

Лучший ответ

Из-за квадратного характера вашего примера это кажется более подходящим для 2D-массива, а не с зазубринами. Но в любом случае вы, безусловно, можете сделать это по старинке и перебрать его. Что-то вроде (непроверено)

for (int i = 0; i < secondArray.Length; i++)
{
    for (int j = 0; j < secondArray[0].Length; j++)
    {
        firstArray[startingRow + i][startingColumn + j] = secondArray[i][j];
    }
}

Изменить. Как и Марк, у меня тоже было небольшое улучшение, немного другое, но в том же духе.

for (int i = 0; i < secondArray.Length; i++)
{
    secondArray[i].CopyTo(firstArray[startingRow + i], startingColumn);
}
2
Anthony Pegram 31 Мар 2010 в 05:50
+1: с вашим редактированием ваше решение также работает для непрямоугольных массивов. :)
 – 
Mark Byers
31 Мар 2010 в 05:53

Это должно работать, даже если ваши поля ввода не прямоугольные:

void copy(int[][] source, int[][] destination, int startRow, int startCol)
{
    for (int i = 0; i < source.Length; ++i)
    {
        int[] row = source[i];
        Array.Copy(row, 0, destination[i + startRow], startCol, row.Length);
    }
}
2
Mark Byers 31 Мар 2010 в 05:46
Хорошая редакция. Я собирался добавить secondArray[i].CopyTo(firstArray[startingRow + i], startingColumn); вместо своего внутреннего цикла. Ты ударил меня!
 – 
Anthony Pegram
31 Мар 2010 в 05:48
@Anthony: На самом деле CopyTo здесь очень хорош - вы должны внести это изменение.
 – 
Mark Byers
31 Мар 2010 в 05:51