Не работает один и тот же код

У меня есть алгоритм, который транспонирует вещественный массив, сначала копируя из него числа во временный массив, а затем обратно заполняя уже транспонированный массив.

Раньше алгоритм вызывался напрямую при нажатии кнопки "транспонировать" и работал абсолютно нормально. Код имел следующий вид:

void Button2Click(object sender, EventArgs e)
{
//L - строки (5)
//N - столбцы (10)
richTextBox1.Clear();
double[,] tmp = new double[N,L];
for (int i = 0; i < N; i++) {
    for (int j = 0; j < L; j++) {
        tmp[i,j] = M[j,i];
        }
    }
for (int i = 0; i < N; i++) {
    string s = "";
    for (int j = 0; j < L; j++) {
        M[i,j] = tmp[i,j];
        }
    }
}

Потом я решил перенести транспонирование в отдельный класс, где создал статический метод с точно таким же кодом:

public static void Transponation(double[,] M, int row, int column) {
double[,] tmp = new double[column,row];
for (int i = 0; i < column; i++) {
    for (int j = 0; j < row; j++) {
        tmp[i,j] = M[j,i];
        }
    }
for (int i = 0; i < column; i++) {
    for (int j = 0; j < row; j++) {
        M[i,j] = tmp[i,j];
        }
    }
}

А для кнопки сделал следующий код:

double[,] Array;
void Button2Click(object sender, EventArgs e)
{
    richTextBox1.Clear();
    Class1.Transponation(Array,row,column);
    richTextBox1.AppendText(Class1.PrintArray(Array));
}

Теперь, когда я выполняю транспонирование, алгоритм останавливается с ошибкой "индекс находился вне границ массива". Причем компилятор показывает, что выполнение кода останавливается на последнем цикле, когда основной массив копирует все числа из временного. Причем это происходит сразу же, как только копируется нулевой элемент. Где в данном случае я допустил ошибку?

UPD: Заметил, что нормально код работает только с квадратной матрицей, в остальном ошибка


Ответы (2 шт):

Автор решения: MBo

Матрица M содержит row строк и column столбцов, как видно из первого цикла.

А потом, не изменив её размеры, вы обращаетесь во втором цикле к column строк и row столбцов

→ Ссылка
Автор решения: aepot

Зачем вы передаете размеры массива переменными, если их можно получить из самого массива? Также, обе копии кода, приведенные в вопросе будут работать для квадратной матрицы, а для прямоугольной - не будут.

Да и само транспонирование можно сделать за 2 цикла, а не за 4. И еще нужно вернуть результат транспонирования как новый массив

public static double[,] Transpose(double[,] array)
{
    int rows = array.GetLength(0);
    int columns = array.GetLength(1);
    double[,] result = new int[columns, rows];
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < columns; j++)
            result[j, i] = array[i, j];
    return result;
}

Еще принято поля и переменные называть с маленькой буквы, а классы, методы и свойства - с большой.

array = Class1.Transpose(array);
→ Ссылка