删除循环中的控件

昨天我写了一段代码来删除满足特定条件的表单中的所有控件。 写得天真,这就是我想出来的。

for (int i = 0; i < this.Controls.Count; ++i) { if (this.Controls[i].Name.Length == 2) { this.Controls.Remove(this.Controls[i); } } 

但事实上,代码是错误的。 然后我将其更改为:

 foreach (Control ctr in this.pbBoardImage.Controls) { if (ctr.Length == 2) { this.Controls.Remove(ctr); } } 

但它仍然不正确。 我知道正确的方法是:

 for (int i = this.Controls.Count - 1; i >= 0; i--) { if (this.Controls[i].Name.Length == 2) { this.Controls.Remove(this.Controls[i]); } } 

然而,它仍然感觉不优雅。 我无法使用List.RemoveAll,因为this.Controls不是List。 那么我可以要求更优雅的方式,最好不要使用循环吗?

不知道为什么你不喜欢这个答案……我突出了重要的RemoveAt ; 但是,作为.NET 3.5 / C#3.0中的替代方案:LINQ:

  var qry = from Control control in Controls where control.Name.Length == 2 select control; foreach(var control in qry.ToList()) { Controls.Remove(control); } 

(原版的)

你不能在foreach Remove – 它打破了迭代器。 这里常见的方法是向后迭代:

 for (int i = this.Controls.Count - 1; i >= 0; i--) { if (this.Controls[i].Name.Length == 2) { this.Controls.RemoveAt(i); // <=========== *** RemoveAt } } 

这避免了“一个一个”的问题,等等。