【问题标题】:Iterate Checkbox property with ForEach without using LINQ使用 ForEach 迭代 Checkbox 属性而不使用 LINQ
【发布时间】:2019-08-23 04:27:36
【问题描述】:

下面的代码遍历表单上的所有复选框,反转每个复选框的 .Checked 状态。

是否可以避免使用 LINQ 来执行此操作?

public void TickChecker()
    {
        foreach (CheckBox con in Controls.OfType<CheckBox>())
        {
            con.Checked ^= true;
        }
    }

【问题讨论】:

  • 您已经得到了答案,但只是一个建议:我认为con.Checked = !con.Checked 比使用 XOR 运算符更具可读性。

标签: c# winforms linq foreach


【解决方案1】:

C# 长期以来一直支持两种运算符来检查对象的类型:is 和 as。 C# 7 添加了一种使用 is 运算符的新方法,该方法将 is 与基本模式相结合,为 as 提供替代方案。所以你可以在你的foreach

foreach (Control con in Controls)
{
    if (con is CheckBox checkBox)
    {
       checkBox.Checked ^= true;
    }
}

【讨论】:

  • 感谢您的回答。一旦我将 .IsChecked 更改为 .Checked,这将使用最少的括号层,因此您会得到刻度线。
  • @Alan IsChecked 听起来像 WPF,如果你使用的是 Winforms,你应该在你的帖子下用标签指定它
  • @MongZhu 谢谢你的建议。我正在使用 System.Windows.Forms,并添加了标签。
  • 也许你应该提到你正在使用模式匹配,它只能从 C# 7 开始工作。在旧版本中,这将不起作用
  • @MongZhu 提到了!
【解决方案2】:

这个呢:

public void TickChecker()
{
    foreach (var con in Controls)
    {
        CheckBox checkBox = con as CheckBox;
        if (null != checkBox)
        {
            checkBox.Checked ^= true;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 2011-01-22
    • 1970-01-01
    • 2020-01-27
    • 2014-10-23
    相关资源
    最近更新 更多