1

J'ai vu le code comme suit dans la boîte à outils Silverlight et ne peut pas comprendre comment il est sûr de le faire:Manipulation ObservableCollection CollectionChanged événement

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); 
     } 
    } 
} 

Si vous supprimez un élément de dire l'indice 5 ne cela change l'indice actuel de chaque article dans la collection _items après l'index 5 pour être un moins qu'avant? Alors, comment est-il sûr de supprimer continuellement des éléments en utilisant leurs "vieux" index comme le fait ce code?

Je voudrais vraiment comprendre pourquoi cela fonctionne.

Des idées?

Répondre

4

Ce code semble supprimer un ensemble contigu d'éléments d'un index de départ particulier. Si vous lisez attentivement l'appel de suppression:

_items.RemoveAt(e.OldStartingIndex); 

Vous remarquerez qu'il supprime itérativement des éléments d'un index constant. Cela signifie qu'il réduit la liste en supprimant des éléments dans une plage contiguë. Cela peut très bien être correct - en supposant que ce soit l'intention du code.

La boucle s'exécute autant de fois que l'indique e.OldItems.Count. Donc (probablement) il est dit combien d'éléments à supprimer à partir d'un index donné.

En règle générale, vous devez faire attention à la façon dont vous supprimez des éléments des collections pour plusieurs raisons:

  1. index d'article ne changent en effet que vous supprimez des éléments. Il faut donc veiller à éviter les erreurs résultant du décalage des positions d'index.
  2. La mutation d'une liste lors d'une itération sur celle-ci (comme dans une boucle foreach ou avec un IEnumerator explicite) entraîne des exceptions. Vous ne pouvez pas muter une liste (ajouter ou supprimer) pendant l'itération - cela invalide l'itérateur.
+0

La seule façon pour moi de donner un sens est de savoir si e.OldItems était garanti par ordre décroissant. Mais je ne vois aucune mention de cela dans les documents MSDN, ce qui me rend nerveux. – user229046

+0

Sans connaître l'intention et les conditions préalables que le code ci-dessus attend, vous ne pouvez pas vraiment dire si c'est correct ou non. Cependant, il semble que cela "pourrait être" correct, si l'intention était de supprimer une série d'éléments ascendants contigus dans une liste. – LBushkin

+0

Eh bien supposons que nous parlons de ObservableCollection qui fait partie de .Net. Il implémente l'interface INotifyCollectionChanged. Je suppose que ce que je demande est, cela garantit-il que NotifyCollectionChangedEventArgs vous donnera des index dans le bon ordre pour permettre au code ci-dessus de toujours fonctionner? De même, ne supprimeriez-vous pas les éléments par ordre décroissant afin de ne pas être affectés par le décalage d'index? – user229046

Questions connexes