我想知道是否有必要检查一下
订阅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);
};
这个想法的缺点是什么?我有什么遗漏的吗?
答案 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
的事件。第一个样本会再次忽略它,第二个样本会对正在移动的同一个项目执行NewItems
和addAction
,这可能会导致令人惊讶的结果。