是否可以在同一个 'if' 语句中有多个复选框?

Is it possible to have multiple checkboxes in the same 'if' statement?

我对编码还很陌生,目前正在学习 C#。更具体地说,我目前正在努力在组框中使用复选框。我想知道是否可以在同一个 'if' 语句中有多个复选框?

我的意思是,不仅仅是(例如):

private void button1_Click(object sender, Eventargs e)
{
  float optionACheckBox = 149.00f;

  if (checkBox1.Checkstate == CheckState.Checked)
  {
     finalPrice = (optionACheckBox + 60)
  }
  MessageBox.Show(finalPrice);
}

我该怎么做才能变成这样:

if (checkBox1 & checkBox2 = CheckState.Checked)
{
 ((Value of checkBox1) + (Value of checkBox2) + 60)
}

如果用户选中 checkBox1 和 checkBox2,那么这两个值都可以用在等式中?

关于这个,是否也可以编写代码来检查是否检查了 GroupBox 中 CheckBoxes 的 any/what 组合?而不是我为不同 CheckBox 的每个组合编写一个 'if' 语句?

感谢所有花时间阅读本文并提供任何提示的人

更多上下文(抱歉,这是我第二次使用 Whosebug post,所以我不太擅长正确的格式设置):

您可以使用 switch case 判断来为这些不同的选择分配不同的结果。

但是因为每一个组合都是一种判断情况,所以不管你用什么判断方法,都需要分别判断。

判断两者都选中的判断应该是这样的:

 if (checkBox1.Checked && checkBox2.Checked)
            {
                //To do something
            }

部分文件: checked&&||== and !=

首先,您不能将 checkbox 本身与 CheckState 进行比较,因此您必须使用 checkBox1.CheckState == CheckState.Checked 或更好地使用布尔“已检查” 属性 : if(checkBox1.Checked) 将检查复选框是否被选中。

关于如何检测是否选中任何复选框的最后一个问题,您可以使用 || 逻辑“或”运算符:

if(checkBox1.Checked || checkBox2.Checked || checkBox3.Checked)

更新

逻辑运算符与条件短路运算符

  1. 逻辑运算符:&用于确保评估和检查所有操作数。
  2. 条件短路运算符:&&用于跳过右侧操作数。

如评论中所述,在绝大多数情况下两者都适用,但我会尽可能使用“条件短路运算符”,以跳过不必要的右侧操作数检查。

你并没有真正告诉我们你的逻辑,但你似乎想要一个假设的场景,比如:

  • 披萨的一些固定底价
  • 每种浇头的价格
  • 应用任意数量浇头的固定价格

因此我会看积累:

float price = 100;

if(anchoviesCheckbox.Checked)
  basePrice += 20;

if(olivesCheckbox.Checked)
  basePrice += 30;

if(chilliesCheckbox.Checked)
  basePrice += 40;

//if anchovies AND chillies are chosen there is a surcharge because the most of the chefs are allergic to this combination and we have to get the manager to do it
if(anchoviesCheckbox.Checked && chilliesCheckBox.Checked)
  basePrice += 50;

//if any one OR more topping has been applied, there is a surcharge
if(anchoviesCheckbox.Checked || olivesCheckbox.Checked || chilliesCheckbox.Checked)
  basePrice += 60;

这些累积是因为没有 else - 如果选中该复选框,成本将添加到最终价格中。每个复选框都是单独查看的。后来有的还联合行动

请注意,您当然也可以检查基本价格是否大于 100 以了解是否要收取附加费..


一旦您清楚了它的工作原理,您可以通过将组框中的复选框视为一个集合来为自己节省一些 ifs

您可以在表单构造函数中执行此操作:

//put the prices in the checkbox Tag:

anchoviesCheckbox.Tag = 20;

olivesCheckbox.Tag = 30;

chilliesCheckbox.Tag = 20;

然后在您的价格计算方法中,您可以执行如下操作:

float basePrice = 100:

foreach(var cb in toppingsGroupBox.Controls.OfType<CheckBox>().Where(cb => cb.Checked))
  basePrice += (int)cb.Tag;

这使用 LINQ 仅提取选中的复选框,然后从其标签中提取价格并将其添加。你甚至可以这样做:

float basePrice = 100 +
  toppingsGroupBox.Controls
    .OfType<CheckBox>()
    .Where(cb => cb.Checked)
    .Sum(cb => (int)cb.Tag);

如果您选择任何浇头,请添加附加费:

if(toppingsGroupBox.Controls
    .OfType<CheckBox>()
    .Any(cb => cb.Checked)))
basePrice += 60;

您现在可以在表单中添加 100 个不同的配料复选框,只要您将价格放入标签中,就无需在计算价格的方法中添加更多代码

“经理必须添加凤尾鱼和辣椒”附加费也可以使用 LINQ 完成。为此,您必须定义一组自定义复选框,如果它们都被选中,则应用附加费:

class PizzaForm:Form{

  CheckBox[] managerSurcharge;

  PizzaForm() { // constructor

    ...
    managerSurcharge = new[]{ anchoviesCheckBox, chilliesCheckBox };

  }

然后在价格中:

if(managerSurcharge.All(cb => cb.Checked))
  basePrice += 50;

看不到 if! (是的,真的很难消除每一个 if..)

但是要好好命名你的控件和变量;由于名称的缘故,这里的代码易于阅读并且很明显它的作用。如果您这样写:

,经理附加费的情况会更加混乱
CheckBox array1 = new[]{ checkbox12, checkbox7 }