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

3

我想知道在订阅NotifyCollectionChangedEventArgsCollectionChanged事件时,是否需要检查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个回答

1
这取决于你想做什么,因为这些代码示例并不等同。除了“Add”和“Remove”之外,还有更多的操作类型。例如,还有“Replace”操作。如果我这样做:
myCollection[0] = new MyObject();

CollectionChanged 事件将以 Replace 操作类型触发,OldItems 将包含被替换的项(旧的 myCollection[0]),而 NewItems 将包含 new MyObject() 项。第一个代码示例将完全忽略此事件。第二个代码示例将使用 addActionremoveAction 处理这两个项。

myCollection.Move(0,1);

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

在我的使用情境中,只需要处理新和旧条目,移动并不重要。如果您触发例如“替换”操作,则我也会使用简化的代码处理旧和新条目。 - ˈvɔlə
1
@Wolle 你说移动不重要,但是你的代码会先执行addAction然后再执行removeAction来处理移动的元素,我怀疑这不是你在这种情况下想要做的(如果确实不重要,你更倾向于忽略它)。 - Evk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接