选中复选框时如何遍历复选框并分配枚举值?

kng*_*158 3 c# checkbox enums loops for-loop

我有一组复选框,准确地说有 3 个复选框。它在使用 if 语句时对我有用,但我想知道有一种方法可以遍历复选框并在选中或更多复选框时分配枚举值。

代码如下所示:

if (chkTomato.Checked && !chkLettuce.Checked && !chkCarrot.Checked)
{
    cart.VegChosen = Veggies.Tomato;
}
else if (!chkTomato.Checked && chkLecctuce.Checked && !chkCarrot.Checked)
{
    cart.VegChosen = Veggies.Lecctuce;
}
else if (!chkTomato.Checked && !chkLecctuce.Checked && chkCarrot.Checked)
{
    cart.VegChosen = Veggies.Carrot;
}
else if (chkTomato.Checked && chkLettuce.Checked && chkCarrot.Checked)
{
    cart.VegChosen = Veggies.All;
}
else if (chkTomato.Checked && chkLettuce.Checked && !chkCarrot.Checked)
{
    cart.VegChosen = Veggies.TomatoAndLettuce;
}
else if (chkTomato.Checked && !chkLettuce.Checked && chkCarrot.Checked)
{
    cart.VegChosen = Veggies.TomatoAndCarrot;
}
else if (!chkTomato.Checked && chkLettuce.Checked && chkCarrot.Checked)
{
    cart.VegChosen = Veggies.LettuceAndCarrot;
}
else
{
    cart.VegChosen = Veggies.None;
}
Run Code Online (Sandbox Code Playgroud)

我想找到一种方法来循环它,以防只有 3 个复选框,if 语句会很长。

谢谢!

Joh*_*ica 5

虽然这不使用循环,但我希望这就是您想要实现的目标。假设您的枚举声明如下:

[Flags]
public enum Veggies
{
    None = 0,
    Tomato = 1,
    Lettuce = 2,
    Carrot = 4,
    TomatoAndLettuce = Tomato | Lettuce,
    TomatoAndCarrot = Tomato | Carrot,
    LettuceAndCarrot = Lettuce | Carrot,
    All = Tomato | Lettuce | Carrot
}
Run Code Online (Sandbox Code Playgroud)

然后您应该能够使用类似的按位方法来分配值:

Veggies selectedVeggies = Veggies.None;
if (chkTomato.Checked)
{
    selectedVeggies = selectedVeggies | Veggies.Tomato;
}

if (chkLettuce.Checked)
{
    selectedVeggies = selectedVeggies | Veggies.Lettuce;
}

if (chkCarrot.Checked)
{
    selectedVeggies = selectedVeggies | Veggies.Carrot;
}

cart.VegChosen = selectedVeggies;
Run Code Online (Sandbox Code Playgroud)

这样做的最终结果将与您当前的一组 if 语句相同。我们使用 1、2、4 等作为枚举值的原因是因为它们在以二进制呈现时没有重叠(1 是 001、2 是 010、4 是 100 等),因此特定位可以只识别那个枚举值。

另请注意,诸如TomatoAndLettuce和 之TomatoAndCarrot类的声明可能也是不必要的,因为您可以使用Enum.HasFlag()

例如:

Veggies selectedVeggies = Veggies.None;
if (chkTomato.Checked)
{
    selectedVeggies = selectedVeggies | Veggies.Tomato;
}

if (chkLettuce.Checked)
{
    selectedVeggies = selectedVeggies | Veggies.Lettuce;
}

if (chkCarrot.Checked)
{
    selectedVeggies = selectedVeggies | Veggies.Carrot;
}

cart.VegChosen = selectedVeggies;
Run Code Online (Sandbox Code Playgroud)

进一步阅读:按位或 | 是什么意思?运营商做什么?

  • 在这种情况下,使用 `1 << 0`、`1 << 1` 和 `1 << 2` 来代替 `1`、`2` 和 `4` 不是很有用吗?它更清楚地表明正在发生的事情及其目的是什么(至少在我看来)。 (2认同)
  • @AlphaDelta 说实话,我只是遵循微软自己的示例中使用的风格。我认为你的选择也是一个很好的方法(可能是更好的方法),尽管按位移位可能需要额外的解释。 (2认同)