2014-07-29 7 views
1

Этот код дает мне ошибку, говорящий, что индекс находится за пределами массива, но если я использую вместо ListBox.Items.Add(), ошибка не возникает.C# index out of bound of array

string[] arr = new string[gradeListbox.Items.Count]; 

for (int i = 0; i < gradeListbox.Items.Count; i++) 
{ 
    arr[i] = gradeListbox.Items[i].ToString(); 
    Regex reg = new Regex(@"[0-9\.]+"); 
    grade = double.Parse(reg.Match(arr[i].ToString()).Value); 
    studentName = Regex.Replace(arr[i], @"[\d-]", string.Empty); 
    gradelistbox.Items.Add(grade + studentName); 

    // ... 
} 

Что происходит? Как я могу исправить это, чтобы он работал с ListBox?

+1

Пожалуйста, пост код, который компилирует. Это недопустимый синтаксис: 'gradelistbox.items.add = grade + studentName' –

+1

' gradelistbox.Items.Add = класс + studentName' по-прежнему недействителен. если он должен быть добавленной строкой, попробуйте: «gradelistbox.Items.Add (grade + studentName);' – czifro

ответ

2

Ваш код продолжает добавлять к gradelistbox.items, тем самым увеличивая его количество. С другой стороны, размер arr остается неизменным. Таким образом, вы получаете исключение индекса за пределы, как только ваш цикл достигает исходных границ gradelistbox.items.

Вы можете исправить эту проблему, заменив массив arr на контейнер, который можно динамически изменять размер - например, List<string>. Это позволит добавлять предметы до arr каждый раз, когда вы добавляете элемент в gradelistbox.items, сохраняя при этом свою длину.

+0

- есть способ удалить список, который вы уже обработали? Например, после того, как вы закончите цикл 1-й строки списка, удалите эту строку. – user3828380

+0

@ user3828380 Да, это возможно, но управление индексами становится кошмаром. Вам было бы лучше создать отдельный список сбоку, записать его в цикле и затем заменить оригинал на нем после завершения цикла. – dasblinkenlight

Смежные вопросы