这是一段自解释性的代码:
while (myInkPresenter.Children.Count > 0)
{
myInkPresenter.Children.RemoveAt(myInkPresenter.Children.Count - 1);
}
然后我想更好的方法可能是:
foreach (UIElement item in myInkPresenter.Children)
{
myInkPresenter.Children.Remove(item);
}
然而,这会引发错误:由于对象的当前状态,操作无效。 所以我有一个想法,并添加了一行额外的代码:
foreach (UIElement item in myInkPresenter.Children)
{
myInkPresenter.Children.Remove(item);
if (myInkPresenter.Children.Count == 0) break;
}
现在它运作正常。
我的问题是这是一个错误还是由于某种原因我应该期待这种行为?
答案 0 :(得分:4)
您的代码仅在只有一个孩子的情况下才有效。如果还有更多,它将会中断 - 它将尝试查找“下一个”项,并注意其内部集合已更改,从而使迭代器无效。
这与InkPresenter
本身无关 - 几乎.NET中的所有集合都以这种方式工作。基本上,您不应该在迭代时修改集合。 (.NET 4中的并发集合是此规则的一组值得注意的例外。)
鉴于您只想清除儿童名单,为什么不打电话:
myInkPresenter.Children.Clear();
?更简单,更易读,更高效。