【问题标题】:Is it necessary to check NotifyCollectionChangedAction in a CollectionChanged event?是否有必要在 CollectionChanged 事件中检查 NotifyCollectionChangedAction?
【发布时间】:2017-10-10 15:30:53
【问题描述】:

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

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

这个想法有什么缺点?我有什么遗漏的吗?

【问题讨论】:

    标签: c# .net events observablecollection inotifycollectionchanged


    【解决方案1】:

    这取决于您要执行的操作,因为这些代码示例并不相同。除了AddRemove,还有更多的操作类型。例如有Replace 动作。如果我这样做:

    myCollection[0] = new MyObject();
    

    CollectionChanged 将被触发,动作类型为ReplaceOldItems 将包含替换项(旧的 myCollection[0]),NewItems 将包含new MyObject() 项。第一个代码示例将完全忽略此事件。第二个代码示例将使用addActionremoveAction 处理这两个项目。如果你这样做:

    myCollection.Move(0,1);
    

    它将触发带有动作Move 的事件,其中OldItemsNewItems 都将包含移动的项目。第一个样本将再次忽略它,第二个样本将在移动的同一项目上执行 addActionremoveAction,我猜这可能会导致令人惊讶的结果。

    【讨论】:

    • 在我的用例中,只需要处理新旧项目。搬家没关系。如果你触发例如replace 操作,我也在用我的简化代码处理旧项目和新项目。
    • @Wolle 你说移动无关紧要,但你的代码将首先执行 addAction 然后 removeAction 移动元素,我怀疑这就是你打算在这种情况下做的事情(如果你宁愿忽略它,如果真的没关系)。
    猜你喜欢
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    相关资源
    最近更新 更多