Почему выводит ошибку: System.IndexOutOfRangeException: "Индекс находился вне границ массива."?

я решил изучить C# и столкнулся с проблемой решения которой нигде не смог найти. Изначально задача звучит так: Дан одномерный массив, сформировать новый массив из элементов кратных C первого массива. Я попутался решить этот массив и мне выдало ошибку

System.IndexOutOfRangeException: "Индекс находился вне границ массива."

Я прошу либо решить ошибку либо, полностью на ваше виденье переписать код и решить задачу.

int k=0, a=0,i=0,c,j=0;
string Omas = "", Tmas = "";
int[] ron = new int[20];
int[] bog = new int[k];
c = int.Parse(textBox1.Text);
Random rnd = new Random();
for (i = 0; i < ron.Length; i++)
{
    ron[i] = rnd.Next(15);
    if (ron[i] % c == 0)
    {
        k++;
    }
    Omas = Omas + "   " + ron[i].ToString();
}
listBox1.Items.Add(Omas);
//Выводим изначальный массив

for (i = 0, j=0; i < 20; i++)
{
    if (ron[i] %c==0)
    {
        bog[j] = ron[i];
        Tmas = Tmas + "   " + bog[j].ToString();
        j++;
    }
}
listBox2.Items.Add(Tmas);
//Выводим конечный массив

Скриншёт


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

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

Вам все правильно написал EvgeniyZ - вы сначала создаете массив (статический) нулевой длины, а потом пытаетесь присвоить значение его элементам, которых нет. Отсюда и ошибка. Необходимо, как Вам и рекомендовали, перенести создание массива bog на место после цикла вычисления k, либо в первом же цикле записывать подходящие кратные значения, скажем в List<int> bog.

Короткое решение задачи:

static int[] DivArray(int min, int max, int c)
{
    // min - нижняя граница интервала генерации случайных чисел
    // max - верхняя граница интервала генерации случайных чисел
    // с - число, на которое будут делиться элементы полученной последовательности  
    
    // Формируем последовательность случайных чисел в диапазоне 
    // между [min и max], равную длине интервала min - max
    var arrRnd = Enumerable.Range(0, max - min + 1)
                           .Select(x => new Random().Next(min, max + 1));
    
    // Выбираем из последовательности arrRnd числа, делящиеся на c без остатка 
    var arrDiv = arrRnd.Where(x => x % c == 0);
    
    // Возвращаем полученный массив
    return arrDiv.ToArray();
}
→ Ссылка