选中复选框时如何遍历复选框并分配枚举值?
c#
我有一组复选框,准确地说有 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;
}
我想找到一种方法来循环它,以防只有 3 个复选框,if 语句会很长。
谢谢!
回答
虽然这不使用循环,但我希望这就是您想要实现的目标。假设您的枚举声明如下:
[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
}
然后您应该能够使用类似的按位方法来分配值:
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;
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;
这样做的最终结果将与您当前的一组 if 语句相同。我们使用 1、2、4 等作为枚举值的原因是因为它们在以二进制呈现时没有重叠(1 是 001、2 是 010、4 是 100 等),因此特定位可以只识别那个枚举值。
另请注意,诸如TomatoAndLettuce和 之TomatoAndCarrot类的声明可能也是不必要的,因为您可以使用Enum.HasFlag()。
例如:
进一步阅读:按位或 | 是什么意思?运营商做什么?
- Would it not be useful in this circumstance to use `1 << 0`, `1 << 1`, and `1 << 2` instead of `1`, `2`, and `4`? It gives a more clear indication of what's happening and what its purpose is (in my opinion at least).
- @AlphaDelta To be honest, I was just following the style used in Microsoft's own examples. I think your option is also a good way (probably better way) of doing it, though perhaps bitwise shifts would require an additional explanation.