是否有必要在CollectionChanged事件中检查NotifyCollectionChangedAction?

时间:2017-10-10 15:30:54

标签: c# .net events observablecollection inotifycollectionchanged

我想知道是否有必要检查一下 订阅NotifyCollectionChangedAction事件时,NotifyCollectionChangedEventArgsCollectionChanged枚举。我偶然发现的每个例子都是这样的:

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 个答案:

答案 0 :(得分:1)

这取决于您要执行的操作,因为这些代码示例不相同。除了saver = tf.train.Saver() saver.restore(sess, "tmp/hsmodel") Add之外,还有更多操作类型。例如,有Remove个动作。如果我这样做:

Replace

myCollection[0] = new MyObject(); 将以操作类型CollectionChanged触发,Replace将包含已替换的项目(旧的myCollection [0]),OldItems将包含NewItems项。第一个代码示例将完全忽略此事件。第二个代码示例将使用new MyObject()addAction来处理这两个项目。如果你这样做:

removeAction

它会触发包含myCollection.Move(0,1); Move动作的动作OldItems的事件。第一个样本会再次忽略它,第二个样本会对正在移动的同一个项目执行NewItemsaddAction,这可能会导致令人惊讶的结果。