Добавление 2D-массива в класс Container через его метод .Add - PullRequest
1 голос
/ 05 марта 2019

У меня проблемы с добавлением 2D-массива в мой контейнерный класс. Помощь будет оценена

Это мой контейнерный класс:

 class Container
{
    string[,] Matrix;
    public int Rows { get; private set; }
    public int Columns { get; private set; }


    public Container(int rows, int columns)
    {
        Rows = rows;
        Columns = columns;
        Matrix = new string[Rows, Columns];
    }

    public void Add(string[,] s1, int height, int width)
    {
        Matrix[Rows++, Columns++] = s1[height, width];
    }

    public string Take(int height, int width)
    {
        return Matrix[height, width];
    }

Ошибка:

Необработанное исключение: System.IndexOutOfRangeException: индекс находился за пределами массива.

в ConsoleApp1.Container.Add (String [,] s1, высота Int32, ширина Int32) в C: \ Users \ Justas \ Desktop \ Bandymas \ ConsoleApp1 \ Program.cs: строка 26 в ConsoleApp1.Program.Read (Int32 n, матрица контейнера) в C: \ Users \ Justas \ Desktop \ Bandymas \ ConsoleApp1 \ Program.cs: строка 92 в ConsoleApp1.Program.Main (String [] args) в C: \ Users \ Justas \ Desktop \ Bandymas \ ConsoleApp1 \ Program.cs: строка 45 Нажмите любую клавишу для продолжения . , .

Ошибка возникает, когда я пытаюсь использовать метод классов-контейнеров .Add для добавления 2D-массива:

        Matrix.Add(array, rowLength, colLength);

Вот так выглядит двумерный массив:

string[,] array = new string[n, n];

        var list = Enumerable
        .Range(0, file.Length / n)
        .Select(i => file.Substring(i * n, n))
        .ToList();

        var res = string.Join(Environment.NewLine, list);
        for (int i = 0; i < n; i++)
        {
            char[] row = list[i].ToCharArray();
            for (int j = 0; j < n; j++)
            {
                array[i, j] = row[j].ToString();
            }
        }

        int rowLength = array.GetLength(0);
        int colLength = array.GetLength(1);

Вот так выглядит мой 2D массив:

    Berzas,su
    la;;sula;
    ;klevu sa
    ldial lap
    asula  a 
      aula, a
    r  suart 
    zemes vai
    kai du   

Это массив 9x9, который я пытаюсь добавить в мой контейнер

Помощь будет принята с благодарностью

1 Ответ

1 голос
/ 05 марта 2019

Если я правильно понимаю, что я не уверен, что вы пытаетесь сделать, это увеличить 2D-массив, добавив элемент по диагонали исходной матрицы:

Например:

row = 2
column = 2


    Matrix = |'str1' | 'str2'|     s = |'str10' | 'str11' |
             |'str3' | 'str4'|         | ...    | ...    |

Чтобы при вызове Container.Add(s,0,0) ожидаемые результаты имели

Matrix = |'str1' | 'str2'| empty |    
         |'str3' | 'str4'| empty |
         |empty  | empty | 'str10'|

Это то, что я понимаю, делает ваш код (возможно, я ошибаюсь). Затем появляется ошибка, потому что вы пытаетесь получить доступ к Matrix [2,2], когда массив Matrix равен 2x2, поэтому третий столбец отсутствует. Одним из решений этого будет

public void Add(string[,] s1, int height, int width)
{
    # Create a new Array
    var newMatrix = new string[Rows++,Columns++]

    # Pass the old array to the new one
    for(i=0;i<Rows-1;i++)
    {
        for(j=0;j<Columns-1;j++)
        {
           newMatrix[i,j] = Matrix[i,j];
        }
    }

    # Add the new element
    newMatrix[Rows, Columns] = s1[height, width];

    # Then make the new matrix the good one
    Matrix = newMatrix; 
}

Я надеюсь, что это полезно, и если я ошибаюсь, я обязательно изменю это.

РЕДАКТИРОВАТЬ:

Хорошо, теперь я думаю, что понимаю, что вы хотите - сохранить массив в классе контейнера, а не добавить элемент. Итак, что вы должны сделать, это

public void Add(string[,] s1, int height, int width)
{
    Matrix  = s1;
    Rows = height;
    Columns = width;
}

Может быть, я слишком упрощен. Дайте мне знать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...