С# — изменение размера зубчатых массивов со ссылками

Я написал небольшой проект, который будет считывать несколько CSV-файлов в зубчатый массив (каждый csv в 1 зубчатый массив). Все массивы будут храниться в списке. После этого у меня есть заданное измерение, в которое я хочу изменить размер каждого массива (с заданными столбцами и строками). Код:

    private void resizeArray( double[][] matrixToResize, int maxRow, int maxColumn)
    {
        Array.Resize(ref matrixToResize, maxRow);

        for (int i = 0; i < matrixToResize.Length; i++)
        {
            Array.Resize(ref matrixToResize[i], maxColumn);
        }
    }

    private void resizeArrayList(List<double[][]> csvList, Dimension dimension)
    {
        foreach (Double[][] matrix in csvList)
        {
            resizeArray(matrix, dimension.Max_Rows, dimension.Max_Columns);
        }
    }

resizeArrayList будет вызываться 1. и затем будет вызываться resizeArray для изменения размера строк и после этого изменения размера для каждой строки заданного количества столбцов.

Моя проблема: В resizeArray все работает хорошо, например: у меня есть массив из 5 строк и 5 столбцов и мне нужно 10 строк и 10 столбцов,

я сначала размер этого массива до 10 строк и после этого каждая строка до 10 столбцов. Прежде чем resizeArray вернется к resizeArrayList, все выглядит нормально, у меня есть 10 строк с каждыми 10 столбцами. Но после того, как код возвращается к методу resizeArrayList, он имеет 5 строк с 10 (!) столбцами в каждой. Таким образом, в основном изменение размера столбцов работает нормально, но 5 добавленных строк исчезли, вернувшись к исходному размеру строк.

Я знаю, что могу решить эту проблему, передав весь зубчатый массив обратно и прочитав его в список. Но почему это так?

Оба раза я использую функцию изменения размера с ref. Но он просто сохраняет столбцы, а не строки с измененным размером.


person christian890    schedule 08.08.2017    source источник


Ответы (1)


Вам придется передать переменную matrix по ссылке, потому что сама ссылка модифицируется в методе resizeArray. В том виде, в котором вы это делаете, все элементы списка csvList остаются прежними — массивами длины 5 — потому что csvList по-прежнему состоит из старых ссылок, тех, что были до изменения размера.

Однако matrix является переменной цикла, и вы не можете изменить ее внутри цикла, а значит, вы не можете передать ее по ссылке на resizeArray. По этой причине я думаю, что в результате вам будет лучше создать совершенно новый список:

private double[][] resizeArray(double[][] matrixToResize,
                               int maxRow, int maxColumn)
{
    Array.Resize(ref matrixToResize, maxRow);

    for (int i = 0; i < matrixToResize.Length; i++)
    {
        Array.Resize(ref matrixToResize[i], maxColumn);
    }

    return matrixToResize;
}

private void resizeArrayList(List<double[][]> csvList, Dimension dimension)
{
    csvList = csvList
        .Select(matrix => 
            resizeArray(matrix, dimension.Max_Rows, dimension.Max_Columns))
        .ToList();
}
person Zoran Horvat    schedule 08.08.2017
comment
Ах, это имеет смысл! Большое спасибо за разъяснение этого, я был совершенно сбит с толку! СПАСИБО! хорошего дня - person christian890; 08.08.2017