@P40b0s

Ошибка по обращению к индексу массива?

Добрый вечер, давненько я не задавал вопросы, но тут не совсем понимаю почему ошибка...
Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')

var runs = p.Elements<DocumentFormat.OpenXml.Wordprocessing.Run>()
                            .Reverse()
                            .Select(s=> new{run = s, props = wordPropertiesService.ExtractRunProperties(s, style) })
                            .ToList();
for (int i = runs.Count() - 1; i >= 0; i--)
                {
                    var currentRun = runs[i];
                    var txt = currentRun.run.Elements<Text>().FirstOrDefault();
                    var equals = runs.TakeWhile(t => 
                                     t.props.Equals(currentRun.props) 
                                     && (t.run.Elements<Drawing>().FirstOrDefault() == null 
                                      && t.run.Elements<Picture>().FirstOrDefault() == null)).ToList();
                        if(equals.Count > 2)
                        for(int e = equals.Count -2; e>= 0; e--)
                        {
                            if (equals[e].run.Elements<Text>().FirstOrDefault() != null)
                                txt.Text += equals[e].run.Elements<Text>().FirstOrDefault()?.Text ?? "";
                            runs.Remove(equals[e]);
                        }
                    //Собственно здесь после того как удалили из массива runs идентичные свойства
                   //в массиве runs остается 1 элемент (изначально было 4)
                   //index здесь равен 0
                        var index = runs.IndexOf(currentRun);
                       //удаляем из массива по индексу 0 1 элемент 
                      // ии получаем вышеприведенную ошибку....
                        runs.RemoveAt(index);
                }
  • Вопрос задан
  • 1297 просмотров
Решения вопроса 1
@P40b0s Автор вопроса
В общем ошибка в том что элементы удаляются а значение счетчика i не меняется, все работает хорошо до тех пор, пока вам надо удалить только 1 элемент за итерацию, а если больше, тут и вылезает эта проблема.
Поэтому после каждого удаления элемента из массива надо значение i корректировать вручную.
Изменяем цикл на for (int i = runs.Count - 1; i >= 0;)
И после каждого успешного удаления подкручиваем счетчик.
if(runs.Remove(equals[e]))
   i--;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы