枚举标志超过2 ^ 32


67

我在应用程序中使用Enum标志。枚举可以包含大约50个以上的值,因此值最多为2 ^ 50。我只是想知道,我可以Math.Pow(2, variable)用来计算这些吗?

当我尝试这样做时,我得到一个常量值编译时错误。除了手动计算这些2的幂并将其放入之外,还有其他方法吗?

这是我在做什么:

[Flags]
internal enum RiskStates : long
    {
        None = 0,
        AL = Convert.ToInt64(Math.Pow(2,0)),
        AK = 2,
        AZ = 4,
        AR = 8,
        CA = 16,
        CO = 32,
        CT = 64,
        DC = 128,
        DE = 256,
        FL = 512,
        GA = 1024,
        HI = 2048,
        ID = 4096,
        IL = 8192,
        IN = 16384,
        IA = 32768,
        KS = 65536,
        KY = 131072,
        LA = 262144,
        ME = 524288,
        MD = 1048576,
        MA = 2097152,
        MI = 4194304
}

5
我将使用带有HashSet的常规枚举。
billpg

4
@ deed02392:由于该枚举的标志性质。您可以组合多个值。每个值“拥有”值的一位。AZ + AK将为6。使用2的幂可以避免不必要的组合冲突
Steve B

6
像其他人一样我最讨厌的答案,告诉你不能做什么,而不是如何做到这一点,但它似乎完全是不可思议的一个标志枚举与50个不同的价值观是什么你的问题是正确的解决方案。并非不是所有这50个标志的所有组合都是真正可行的,在这种情况下,您应该使用一个或多个简单的枚举,或者是,并且您可以使用更智能的数据结构?
jwg 2013年

2
@jwg的各个标志似乎是美国的50个州。这将是一个有趣的聚会游戏,随机选择n50个子集中的一个,并尝试找到一些独特的属性,以使所有人都n拥有该属性,而其他人50-n则没有。好吧,是否有趣,取决于聚会的客人...
AakashM 2013年

6
@AakashM我认为您的聚会对我来说有点太疯狂了。
RBarryYoung 2013年

Answers:


125

当我尝试这样做时,我得到一个常量值编译时错误。

如果您使用L后缀将其强制为long文字,那么实际上您会好起来的,但是必须手动指定所有后缀仍然不理想。(阅读代码时,这不是“明显正确”。)

您不能使用Math.Pow该表达式,因为它必须是一个编译时常量-但您可以使用位移:

None = 0,
AL = 1L << 0,
AK = 1L << 1,
AZ = 1L << 2

等等。我认为无论如何,它还是更具可读性的:)


17
您是说您不知道心中至少2到64的2的幂的所有数字吗?你弄破了我的泡沫!
用户

94
@MichaelKjörling:当然知道,但是我也必须考虑凡人……
Jon Skeet 2013年

1
我想象位转移也是一个凌晨快一点到类型......除非你每分钟可输入无穷的话。
Patrick M

1
@JonSkeet我想赞成该评论,但现在是42岁,我无法改变自己的观点!
罗布H

3
@RobH我发了子弹。把自己打昏!
lesderid 2013年

9

如果您改用2的幂更规则的非十进制表示法,则不再需要自动生成它们,例如:

// octal
AL = 0001L,
AK = 0002L,
AZ = 0004L,
AR = 0010L,
CA = 0020L,
CO = 0040L,
CT = 0100L,
...

// hexadecimal
AL = 0x001L,
AK = 0x002L,
AZ = 0x004L,
AR = 0x008L,
CA = 0x010L,
CO = 0x020L,
CT = 0x040L,
...

不回答问题。
Eric Wu

但这确实解决了一个问题,即在以base 10为基础进行指定时,很难输入,验证和理解枚举常量。一种解决方案是按照OP的要求自动生成,另一种解决方案是切换到更清晰的基础。我希望更新后的答案能更好地反映这一点。
汤姆(Tom)

1

我很想考虑使用BitArray作为底层结构。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.