3

CollectionChangedイベントに登録するときに、NotifyCollectionChangedEventArgsNotifyCollectionChangedAction列挙をチェックする必要があるかどうかは疑問です。このようにそれをしない時に、私がつまずいたすべての例:CollectionChangedイベントでNotifyCollectionChangedActionをチェックする必要がありますか?

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

はそれがNotifyCollectionChangedActionを無視して、ちょうどこのようなコードを簡素化することが可能です:

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

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

このアイデアの欠点は何ですか?私が逃したものはありますか?

答えて

1

これらのコードサンプルは同等ではないため、実行しようとする内容によって異なります。ちょうどAddRemoveより多くの行動タイプがあります。例えば、Replaceアクションがあります。私はこれを行う場合:

myCollection[0] = new MyObject(); 

CollectionChangedOldItemsが交換アイテムが含まれている(旧myCollection [0])とNewItemsnew MyObject()項目が含まれていますので、アクションタイプReplaceで起動されます。最初のコードサンプルはこのイベントを完全に無視します。 2番目のコードサンプルは、addActionremoveActionの両方の項目を処理します。そうした場合:

myCollection.Move(0,1); 

これは、両方のOldItemsNewItemsが移動した項目が含まれていますアクションMoveとイベントを発生します。最初のサンプルでは無視され、同じアイテム上でaddActionremoveActionが実行され、驚くべき結果につながる可能性があります。

+0

私の使用例では、新旧のアイテムを処理するだけで済みます。移動は問題ではありません。例: 'replace'アクション、私は新しいitemを私の単純化されたコードで処理しています。 – WoIIe

+1

@Wolle移動は問題ではありませんが、コードでは最初にaddActionを実行し、次に移動した要素に対してremoveActionを実行します。この場合、あなたが意図していることは疑いの余地があります。 – Evk

関連する問題