Индекс вне диапазона, используя списки и цикл - PullRequest
0 голосов
/ 22 мая 2018

У меня есть этот цикл, который для каждого вопроса, который он должен создать, генерирует и затем форматирует «сформулированный вопрос» из множества вопросов, таких как;«Какова сумма {0} + {1}?».Затем этот цикл форматирует его, добавляет сформулированный вопрос и ответ в массив.

// Use for loop to create the correct amount of questions
                for (int i = 0; i < Data.Questions.numQuestions; i++)
                {
                    Random rnd = new Random();
                    Data.Questions.Sum sum = new Data.Questions.Sum();

                // Create part one and part two of the question using random numbers
                // ex. 3 + 5
                // 3 = partOne, 5 = partTwo
                int partOne = rnd.Next(Data.Questions.Sum.min, Data.Questions.Sum.max);
                int partTwo = rnd.Next(Data.Questions.Sum.min, Data.Questions.Sum.max);

                // Randomly select one of the word questions
                string fullQuestion = Data.Questions.Sum.wordedQuestions[rnd.Next(0, Data.Questions.Sum.wordedQuestions.Length)];

                // Format the string with the generated numbers
                fullQuestion = string.Format(fullQuestion, partOne, partTwo);

                // Set out-of-class variables to be displayed to the user
                Data.Questions.Sum.questions[i] = fullQuestion;
                Data.Questions.Sum.answers[i] = partOne + partTwo;
            }

И Data.Questions.Sum.questions, и Data.Questions.Sum.answers - это List<string> и List<int>.

Однако, когда этот цикл запускается, при i = 0 меня бросают;

System.ArgumentOutOfRangeException: 'Индекс был вне диапазона.Должен быть неотрицательным и меньшим, чем размер коллекции.Имя параметра: index '

Кто-нибудь знает, что я делаю неправильно?Насколько я знаю, списки являются динамическими, и я определил так:

// Arrays containing all questions and answers
                // used to display questions and check answers
                public static List<string> questions = new List<string>();
                public static List<int> answers = new List<int>();

Кроме того, чтобы уточнить, я не хочу использовать .Add (), так как яесть панель настроек, которая, когда вы нажимаете «Применить», перезапускает этот цикл, чтобы вопросы соответствовали текущим настройкам.Мне нужен цикл, чтобы переопределить предыдущие значения.

Редактировать: при использовании массивов лучший вариант здесь, я получаю;

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

При присвоении Data.Questions.Sum.answers[i], после присвоения массива следующим образом;public static int[] answers {};

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

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

Выможно сделать это с помощью метода расширения, такого как этот ...

public static class ListExtentions
{
    public static void AddOrUpdate<T>(this List<T> that, int index, T value)
    {
        if (that.Count > index)
        {
            that[index] = value;
        }
        else
        {
            that.Add(value);
        }
    }
}

..., который затем может быть назван так ...

list.AddOrUpdate(index, value);

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

Если количество вопросов изменится при изменении вашего пользовательского интерфейса, вам также придется решать проблему с масштабированием вниз коллекция, чтобы гарантировать удаление старых элементов, что гораздо проще, если вы просто создаете новые экземпляры коллекций каждый раз, когда вам нужно восстановить вопросы / ответы.

0 голосов
/ 22 мая 2018

Вероятно, это является причиной вашей проблемы (я попросил разъяснений в комментариях, где вы не ответили).

Все еще выкладываю это как ответ, так как это потенциальная ошибка, и вынеобходимо исправить это.

Как вы упоминали, вы сталкиваетесь с этим исключением на i=0.высока вероятность того, что это каждый раз, а не какой-либо конкретный случай.

Если Data.Questions.Sum.questions пусто, то Data.Questions.Sum.questions[i] = fullQuestion; обязательно вызовет такое исключение.То же самое относится и к Data.Questions.Sum.answers.

В этом случае вы должны использовать .Add() для вставки в список.

, поэтому ваш код должен быть,

if (Data.Questions.Sum.questions.Count > i)
    Data.Questions.Sum.questions[i] = fullQuestion;
else
    Data.Questions.Sum.questions.Add(fullQuestion);

Но если они не пусты, это не должно быть причиной этого исключения.


Еще одна вещь, которую я заметил в вашем коде: Data.Questions.Sum.wordedQuestions.

Даже если у вас естьдействительный список (здесь Data.Questions.Sum.wordedQuestions) - поскольку у вас есть Length prop, это должен быть массив, а не список.

Если он пуст, при этом

string fullQuestion = Data.Questions.Sum.wordedQuestions[rnd.Next(0, Data.Questions.Sum.wordedQuestions.Length)];

эта строка обязательно выдаст

Необработанное исключение типа 'System.ArgumentOutOfRangeException' произошло в mscorlib.dll

, так как вы пытаетесь получить из него данные 0-го индекса.

Итак, прежде чем извлекать данные из списка или массива, сначала вам нужно проверить, есть ли у них данные init,а также у него есть тот индекс, который вы спрашиваете.

что-то вроде

string fullQuestion = string.Empty;

if (Data.Questions.Sum.wordedQuestions != null &&
    Data.Questions.Sum.wordedQuestions.Length > 0)
{
    //here the way you are creating random number, 
    // you are assured about index is present in array.
    int indexForWordedQuestion = rnd.Next(0, Data.Questions.Sum.wordedQuestions.Length);
    fullQuestion = Data.Questions.Sum.wordedQuestions[indexForWordedQuestion];
}
0 голосов
/ 22 мая 2018

Если вы не можете .Add() в этих списках - создайте копию этих списков и .Add() там.В списках есть что-то особенное: new List<T>(IEnumerable<T>)

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