gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:32:25 24 4
gpt4 key购买 nike

我想知道是否有必要检查 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com