gpt4 book ai didi

c# - 这是 Cast 在 Controls 集合上的正常行为吗?

转载 作者:行者123 更新时间:2023-11-30 19:37:58 24 4
gpt4 key购买 nike

大家好,我发现了一个我无法从逻辑上解释的问题。在以下代码片段中,flpRecordIndexes 是一个包含大量 RecordIndexControl(我创建的用户控件)的 FlowLayoutPabel。我想删除除第一个控件之外的所有内容。与 flpRecordContainer 相同的想法。

如果我执行这个(没有 ToList 调用),它只会删除一半的控件,例如,如果它是一个序列,它将删除 (2,4,6,8) 等。

foreach (var recordIndexControl in flpRecordIndexes.Controls.Cast<RecordIndexControl>().Skip(1))
{
flpRecordIndexes.Controls.Remove(recordIndexControl);
}
foreach (var recordControl in flpRecordContainer.Controls.Cast<RecordControl>().Skip(1))
{
flpRecordContainer.Controls.Remove(recordControl);
}

如果我执行此操作(使用 ToList),它会删除除第一个控件之外的所有内容,这是我想要的。

foreach (var recordIndexControl in    flpRecordIndexes.Controls.Cast<RecordIndexControl>().ToList().Skip(1))
{
flpRecordIndexes.Controls.Remove(recordIndexControl);
}
foreach (var recordControl in flpRecordContainer.Controls.Cast<RecordControl>().ToList().Skip(1))
{
flpRecordContainer.Controls.Remove(recordControl);
}

为什么在没有 ToList 的情况下调用 Cast 会产生这种行为?

最佳答案

这是完全正常的,您正在修改正在使用 Controls.Remove() 调用迭代的集合。 Controls 集合的行为与其他框架集合不同,它不会在您执行此操作时抛出异常。因此,实际上您会根据混音移除所有其他控件。

ToList() 调用创建了 Controls 集合的副本,它不再受 Remove() 调用的影响。这是正确的解决方法。

请记住,您很可能有严重的泄漏。您删除的控件必须 被释放。你不能再依赖 Winforms 为你做这件事,它不能,因为它们不再在 Controls 集合中。未能处理它们是永久性泄漏,垃圾收集器无能为力。

关于c# - 这是 Cast<T> 在 Controls 集合上的正常行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35992428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com