问题描述
由于 ClientStack.Children 范围在 ClientStack.Children 成员(文本块)被删除后发生变化而引发异常:
foreach (TextBlock textblock in ClientStack.Children)
{
if ((string)textblock.ToolTip == e.IP)
{
ClientStack.Children.Remove(textblock);
// update foreach loop's range???
}
}
有没有办法在 ClientStack.Children 成员被删除后更新这个 foreach 循环的范围?
解决方法
在枚举集合时无法修改集合,因此会出现异常。
您可以使用向后的 for-loop
:
for(int i = ClientStack.Children.Count - 1; i >= 0; i--)
{
if (((string)ClientStack.Children[i]).ToolTip == e.IP)
{
ClientStack.Children.RemoveAt(i);
}
}
另一种 - 效率稍低 - 方法是使用删除集合:
var removeBlocks = ClientStack.Children.Cast<object>()
.Where(textblock => ((string)textblock).ToolTip == e.IP)
.ToList();
removeBlocks.ForEach(ClientStack.Children.Remove);
,
迭代时无法更新范围。而是制作集合的副本并对其进行迭代,但从原始集合中删除。
foreach (TextBlock textblock in ClientStack.Children.ToList())
{
if ((string)textblock.ToolTip == e.IP)
{
ClientStack.Children.Remove(textblock);
}
}