假设我有这样一个enum:
[Flags]
enum Letters
{
A = 1,
B = 2,
C = 4,
AB = A | B,
All = A | B | C,
}
为了检查AB是否被设置,我可以这样做:
if((letter & Letters.AB) == Letters.AB)
有没有一种比下面更简单的方法来检查是否设置了一个组合标志常量的任何标志?
if((letter & Letters.A) == Letters.A || (letter & Letters.B) == Letters.B)
例如,可以将&与其他东西交换吗?
为了检查AB是否被设置,我可以这样做:
if((字母和字母。ab) ==字母。ab)
有没有一种比下面更简单的方法来检查是否设置了一个组合标志常量的任何标志?
这将检查是否设置了A和B,并忽略是否设置了任何其他标志。
if((字母和字母。a) ==字母。||(字母和字母。b) ==字母。b)
这将检查是否设置了A或B,并忽略是否设置了任何其他标志。
这可以简化为:
if(letter & Letters.AB)
这是二进制运算的C;应用到c#应该很简单:
enum {
A = 1,
B = 2,
C = 4,
AB = A | B,
All = AB | C,
};
int flags = A|C;
bool anything_and_a = flags & A;
bool only_a = (flags == A);
bool a_and_or_c_and_anything_else = flags & (A|C);
bool both_ac_and_anything_else = (flags & (A|C)) == (A|C);
bool only_a_and_c = (flags == (A|C));
顺便提一下,问题示例中变量的命名是单数字母“letter”,这可能暗示它只代表一个字母;示例代码清楚地表明,它是一组可能的字母,并且允许多个值,因此可以考虑将变量重命名为“letters”。
你可以检查这个值是否不为零。
if ((Int32)(letter & Letters.AB) != 0) { }
但是我认为引入一个值为0的新枚举值并与该枚举值进行比较是更好的解决方案(如果可能的话,因为您必须能够修改枚举)。
[Flags]
enum Letters
{
None = 0,
A = 1,
B = 2,
C = 4,
AB = A | B,
All = AB | C
}
if (letter != Letters.None) { }
更新
看错了问题——修正了第一个建议,忽略第二个建议。