如何不使用foreach指定panel控件中picture box的位置,能否用for循环实现
解答
完全可以用for循环替代现有foreach实现,还能顺便规避原有实现的类型转换风险:原有foreach直接遍历Controls集合并强制转换为PictureBox,若panel内存在其他类型的控件会直接抛出异常。
实现方案1(推荐,逻辑清晰边界安全)
先筛选出所有PictureBox类型控件,再直接遍历前12个,无需手动计数和break:
// 筛选panel内所有PictureBox,排除其他类型控件干扰 var pictureList = panel1.Controls.OfType<PictureBox>().ToList(); // 用Math.Min做边界兼容,即使PictureBox总数不足12也不会越界 for (int i = 0; i < Math.Min(12, pictureList.Count); i++) { PictureBox currentPic = pictureList[i]; currentPic.Enabled = false; // 禁用卡片点击 points.Add(currentPic.Location); // 采集位置 }
实现方案2(无LINQ依赖,兼容老版本.NET框架)
如果项目不能使用LINQ的OfType方法,可以在原生遍历Controls集合时手动做类型判断:
int processedCount = 0; // 循环条件同时限制控件总数和处理上限,不需要循环内写break for (int i = 0; i < panel1.Controls.Count && processedCount < 12; i++) { if (panel1.Controls[i] is PictureBox currentPic) { currentPic.Enabled = false; points.Add(currentPic.Location); processedCount++; } }
内容的提问来源于stack exchange,提问作者Kyson
相关产品推荐
相关产品推荐

