如何在WinForms中合并遍历Button与Label的foreach代码?
当然可以合并!重复遍历两次this.Controls完全没必要,只需要一次遍历,在循环里通过条件判断区分控件类型就好,既简洁又能提升一点点性能(虽然对于少量控件来说差异不大,但代码会干净很多)。
推荐写法(C# 7.0+,使用模式匹配)
这种写法最直观,直接通过is表达式把控件转换为对应类型,同时赋值给变量,后续直接用变量操作就行:
foreach (Control c in this.Controls) { if (c is Button btn) { // 这里写你的Button专属处理逻辑 btn.BackColor = Color.LightBlue; btn.Click += Button_Click; } else if (c is Label lbl) { // 这里写你的Label专属处理逻辑 lbl.Font = new Font(lbl.Font.FontFamily, 10, FontStyle.Bold); lbl.TextAlign = ContentAlignment.MiddleCenter; } }
兼容旧版本C#的写法(使用as关键字)
如果你的项目还在使用C# 7.0之前的版本,没法用模式匹配,可以用as来转换,再判断是否为null:
foreach (Control c in this.Controls) { Button btn = c as Button; if (btn != null) { // Button处理逻辑 btn.Text = "已处理"; continue; // 跳过后续判断,直接进入下一次循环 } Label lbl = c as Label; if (lbl != null) { // Label处理逻辑 lbl.ForeColor = Color.DarkGreen; } }
小提示
如果之后需要处理更多控件类型(比如TextBox、CheckBox),只需要在循环里继续加else if判断就行,整个逻辑依然清晰,而且始终只遍历一次控件集合,比多个foreach循环更高效。
内容的提问来源于stack exchange,提问作者dim
相关产品推荐
相关产品推荐

