С# Функция, соединяющая два любых массива. Ошибка: индекс находился вне границ массива

задание следующее:

Напишите функцию, которая будет соединять два массива таким образом: из, к примеру, [2, 4, 6] и ['a', 'b', 'c'] она сделает [2, 'a', 4, 'b', 6, 'c']. Т.е. сделать так, чтобы элементы двух массивов чередовались.

Проблем сделать это с массивами одинаковых размеров у меня не составило:

        void ArrCon(string[] Arr, string[] Arr2)  // Метод для соединения двух массивов
        {
            string str = " ";             // переменная для соединения символов двух массивов
           
            for (int j = 1; j < Arr2.Length; j++)
            {
                str += Arr[j];
                str += ", ";
                str += Arr2[j];
                if (Arr2.Length == j + 1)
                {
                    str += ". ";
                    break;
                }
                str += ", ";
            }
                Console.WriteLine("\n---------------------------------------------------------");
                Console.WriteLine($"\nСоединение двух массивов: {str}");
        }


        Console.Write("Введите количество элементов для первого массива: ");
        int n = Convert.ToInt32(Console.ReadLine());               // определение количество символов в массиве
        string[] arr = new string[n + 1];                          // создение массива arr 
        int i;

        Console.WriteLine("Введите элементы для массива: ");       // заполнение массива символами

        for (i = 1; i <= n; i++)
        {
            Console.Write($"Элемент {i} = ");
            arr[i] = Console.ReadLine();
        }

        Console.WriteLine();
        Console.Write("Массив: ");
        for (i = 1; i <= n; i++)
        {
            Console.Write($"{arr[i]} \t");
        }

        Console.WriteLine("\n---------------------------------------------------------");

        Console.Write("\nВведите количество элементов для второго массива: ");
        int n2 = Convert.ToInt32(Console.ReadLine());             // определение количества символов в массиве
        string[] arr2 = new string[n2 + 1];                       // создание массива arr2 
        int i2;

        Console.WriteLine("Введите элементы для массива: ");      // заполнение массива символами

        for (i2 = 1; i2 <= n2; i2++)
        {
            Console.Write($"Элемент {i2} = ");
            arr2[i2] = Console.ReadLine();
        }

        Console.WriteLine();
        Console.Write("Массив: ");
        for (i2 = 1; i2 <= n2; i2++)
        {
            Console.Write($"{arr2[i2]} \t");
        }


        ArrCon(arr, arr2);                                       // проверка
        Console.WriteLine("########################################################");

Вывод в консоль:

########################################################
Введите количество элементов для первого массива: 4
Введите элементы для массива:
Элемент 1 = 1
Элемент 2 = 2
Элемент 3 = i
Элемент 4 = e

Массив: 1       2       i       e
---------------------------------------------------------

Введите количество элементов для второго массива: 4
Введите элементы для массива:
Элемент 1 = q
Элемент 2 = s
Элемент 3 = 54
Элемент 4 = 333

Массив: q       s       54      333
---------------------------------------------------------

Соединение двух массивов:  1, q, 2, s, i, 54, e, 333.
########################################################

Однако я попытался реализовать возможность соединения двух массивов разных размеров, к примеру: {1, 2, 3, 4, 5} и {а, п} и чтобы в результате получилось: 1, а, 2, п, 3, 4, 5. Но программа начала выдавать ошибку, которую мне не удается исправить: "Индекс находился вне границ массива".

    void ArrCon(string[] Arr , string[] Arr2)  // Метод для соединения двух массивов
    {
        string str = " ";                      // переменная для соединения символов двух массивов

        if (Arr.Length > Arr2.Length)          //Если размер первого массива превышает размер второго
        {
            for (int j = 1; j < Arr.Length; j++)
            {
                str += Arr[j];
                str += ", ";
                
                if (j > Arr2.Length)           // когда шаг больше размера (ОШИБКА ЗДЕСЬ)    
                {
                    for (int f = j + 1; f < Arr.Length; f++)
                    {
                        str += Arr[f];

                        if (Arr.Length == f)
                        {
                            str += ". ";
                            break;
                        }

                        str += ", ";
                    }
                }
                str += Arr2[j];
                str += ", ";
            }

            Console.WriteLine("\n---------------------------------------------------------");
            Console.WriteLine($"\nСоединение двух массивов: {str}");
        }

        else if (Arr.Length < Arr2.Length) //Если размер второго массива превышает размер первого 
        {
            //по аналогии с первым случаем
        }

        else if (Arr.Length == Arr2.Length) //Если массивы равны
        {
            for (int j = 1; j < Arr2.Length; j++)
            {
                str += Arr[j];
                str += ", ";
                str += Arr2[j];
                if (Arr2.Length == j + 1)
                {
                    str += ". ";
                    break;
                }
                str += ", ";


            }
            Console.WriteLine("\n---------------------------------------------------------");
            Console.WriteLine($"\nСоединение двух массивов: {str}");
        }

    }

Ошибка ссылается на строчку со следующим кодом: str += Arr2[j]; (в самом коде это место обозначил комментарием). Программа почему-то не видит условия if (j > Arr2.Length) и продолжает выполняться дальше, из-за чего конечно же выдает ошибку:

########################################################
Введите количество элементов для первого массива: 5
Введите элементы для массива:
Элемент 1 = 1
Элемент 2 = 2
Элемент 3 = 3
Элемент 4 = 4
Элемент 5 = 5

Массив: 1       2       3       4       5
---------------------------------------------------------

Введите количество элементов для второго массива: 2
Введите элементы для массива:
Элемент 1 = а
Элемент 2 = п

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

Программа останавливается на следующем этапе: 1, а, 2, п, 3,

Прошу помощи в решении этой проблемы. Возможно, что код в условии if (j > Arr2.Length) так же неправильный, т.к. программа в него не заходила и проверить этот момент я не могу.


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

Автор решения: S.H.

Ошибка в том, что вы продолжаете "бежать" по массиву, который уже закончился.

Чтобы этого не происходило - надо добавить проверку на размер массива.

Вы рассматриваете три случая отдельно, и, думаю, где то там в коде и есть ошибка.

Проще написать это одним фрагментом кода, который будет "бежать" по обеим массивам одновременно, от нуля до максимального размера массива, если массив кончился - то просто "пропускать ход"

Основыаясь на Вашем коде, я бы такое написал так:

    int maxlen = Max(Arr.Length, Arr2.Length);
    for( int i=0; i<maxlen; i++ )
    {
        if ( i<Arr.Length )
            s += Arr[j] + " ";
        if ( i<Arr2.Length )
            s += Arr2[j] + " ";
    }

Это - вроде бы минимальное исправление именно Вашего кода.

Но по хорошему не надо "склеивать" строки, надо использовать StringBuilder

→ Ссылка