我在Silverlight工具包中看到过如下代码,无法理解它的安全性:
private void ItemsSourceCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// Update the cache
if (e.Action == NotifyCollectionChangedAction.Remove && e.OldItems != null)
{
for (int index = 0; index < e.OldItems.Count; index++)
{
_items.RemoveAt(e.OldStartingIndex);
}
}
}
如果你从索引5中删除一个项目,那么是否会将索引5之后_items
集合中每个项目的当前索引更改为比以前少一个?那么如何使用像这段代码那样的“旧”索引来连续删除项目是否安全?
我真的很想知道为什么会这样。
有什么想法吗?
答案 0 :(得分:4)
此代码看起来正在从特定的起始索引中删除一组连续的项目。如果您仔细阅读删除电话:
_items.RemoveAt( e.OldStartingIndex );
您会注意到它正在迭代地从常量索引中删除项目。这意味着它通过删除连续范围中的项目来折叠列表。这可能是正确的 - 假设这是代码的意图。
循环执行的次数与e.OldItems.Count
指示的次数相同。所以(大概)它会告诉从给定索引开始删除多少项。
作为一般做法,您必须小心如何从集合中删除项目,原因如下: