3

Je me demande s'il est nécessaire de vérifier l' NotifyCollectionChangedAction enum du NotifyCollectionChangedEventArgs, lors de la souscription à l'événement CollectionChanged. Chaque exemple, je suis tombé sur-t-il comme ceci:Est-il nécessaire de vérifier NotifyCollectionChangedAction dans un événement CollectionChanged?

myCollection.CollectionChanged += (sender, eventArgs) => 
{ 
    if (eventArgs.Action == NotifyCollectionChangedAction.Add) 
    { 
     foreach (SampleClass sampleObject in eventArgs.NewItems) 
     { 
      addAction(sampleObject); 
     } 
    } 
    else if (eventArgs.Action == NotifyCollectionChangedAction.Remove) 
    { 
     foreach (SampleClass sampleObject in eventArgs.OldItems) 
     { 
      removeAction(sampleObject); 
     } 
    } 
    // ... 
}; 

Est-il possible d'ignorer la NotifyCollectionChangedAction et simplifier tout le code comme ceci:

myCollection.CollectionChanged += (sender, eventArgs) => 
{ 
    eventArgs.NewItems?.OfType<SampleClass>() 
     .ToList() 
     .ForEach(addAction); 

    eventArgs.OldItems?.OfType<SampleClass>() 
     .ToList() 
     .ForEach(removeAction); 
}; 

Quels sont les inconvénients de cette idée? Y a-t-il quelque chose que j'ai manqué?

Répondre

1

Cela dépend de ce que vous essayez de faire, car ces exemples de code ne sont pas équivalents. Il y a plus de types d'actions que simplement Add et Remove. Par exemple, il y a l'action Replace. Si je fais ceci:

myCollection[0] = new MyObject(); 

CollectionChanged sera tiré avec le type d'action Replace, OldItems contiendra élément remplacé (ancien myCollection [0]) et NewItems contiendra new MyObject() article. Le premier exemple de code ignore complètement cet événement. Deuxième exemple de code traitera les deux éléments avec addAction et removeAction. Si vous faites:

myCollection.Move(0,1); 

Il événement déclenche une action Move où les deux OldItems et NewItems contiendra élément déplacé. Le premier échantillon l'ignorera à nouveau et le second effectuera addAction et removeAction sur le même objet en cours de déplacement, ce qui pourrait conduire à des résultats surprenants je suppose.

+0

Dans mon cas d'utilisation, il est juste nécessaire de traiter les éléments nouveaux et anciens. Le déplacement n'a pas d'importance. Si vous déclenchez par ex. l'action 'replace', je traite l'ancien et le nouvel élément avec mon code simplifié. – WoIIe

+1

@Wolle Vous dites que le déplacement n'a pas d'importance, mais vous codez d'abord addAction puis removeAction pour l'élément déplacé, je doute que ce soit ce que vous avez l'intention de faire dans ce cas (vous préférez l'ignorer si cela n'a pas d'importance). – Evk