Обработка события ObservableCollection CollectionChanged Event

Я видел код, подобный следующему, в наборе инструментов Silverlight и не могу понять, как это безопасно сделать:

private void ItemsSourceCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    // Update the cache
    if (e.Action == NotifyCollectionChangedAction.Remove && e.OldItems != null)
    {
        for (int index = 0; index < e.OldItems.Count; index++)
        {
            _items.RemoveAt(e.OldStartingIndex);
        }
    }
}

Если вы удалите элемент из, скажем, индекса 5, это не изменит текущий индекс каждого элемента в _items сбор после индекса 5 будет на один меньше, чем раньше? Так как же безопасно постоянно удалять элементы, используя их "старые" индексы, как это делает этот код?

Мне бы очень хотелось понять, почему это работает.

Есть идеи?

1 ответ

Этот код выглядит так, как будто он удаляет непрерывный набор элементов из определенного начального индекса. Если вы внимательно прочитали удаление вызова:

_items.RemoveAt( e.OldStartingIndex );  

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

Цикл выполняется столько раз, сколько e.OldItems.Count указывает на то. Так (предположительно) сказано, сколько элементов нужно удалить, начиная с заданного индекса.

Как правило, вы должны быть осторожны с удалением элементов из коллекций по нескольким причинам:

  1. Индексы предметов действительно меняются при удалении предметов. Поэтому следует позаботиться о том, чтобы избежать ошибок, возникающих в результате смещения позиций индекса элемента.
  2. Мутирование списка во время итерации по нему (как в цикле foreach или с явным IEnumerator) приводит к исключениям. Вы не можете изменить список (добавить или удалить) во время итерации - это делает итератор недействительным.
Другие вопросы по тегам