微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 C# 中使用 foreach 循环改变其范围

如何解决如何在 C# 中使用 foreach 循环改变其范围

由于 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);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。