c# - 是否需要在 CollectionChanged 事件中检查 NotifyCollectionChangedAction?

标签 c# .net events observablecollection inotifycollectionchanged

我想知道是否有必要检查 NotifyCollectionChangedAction NotifyCollectionChangedEventArgs 的枚举, 当订阅 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);
        }
    }
    // ...
};

是否可以忽略 NotifyCollectionChangedAction并像这样简化代码:

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

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

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

最佳答案

这取决于您要做什么,因为这些代码示例并不等效。除了 AddRemove 之外,还有更多操作类型。例如,有 Replace 操作。如果我这样做:

myCollection[0] = new MyObject();

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

myCollection.Move(0,1);

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

关于c# - 是否需要在 CollectionChanged 事件中检查 NotifyCollectionChangedAction?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46670586/

相关文章:

c# - 在 json.Net 中创建命名子数组

.net - 如何在 TeamCity Ubuntu Linux 上启用 NuGet 恢复?

java - 计算事件的下一个日期

C# - 使用 if/else 语句查找最多 3 个数字

C#请求中的web服务密码需要加密

c# - 由旧 C 代码编写的文件,已移至 C#

c# - Entity Framework 中的 "The data reader has more than one field"错误

.net - 在 Web.config 中添加程序集时,我可以指定任何版本或范围吗?

c# - 当默认音频输入更改时,.NET 中是否有事件?

javascript - jQuery 自动完成选择更改后触发?