【问题标题】:Struggling with enum flags与枚举标志作斗争
【发布时间】:2014-04-04 12:45:19
【问题描述】:

我有一个枚举来代表两种状态,我想创建组合。今天早上做了一些阅读后,我遇到了 flags 属性。我知道,如果您每次以 2 的幂次方递增,则二进制值仅设置一个位,因此可以进行组合。

<Flags()> _
Public Enum TaskStatus
    Incomplete = 1
    Complete = 2
End Enum

1 = 0000001    
2 = 0000010

所以 1+2 的组合将是 0000011

然后我想构造一个数据库参数来指示已选择哪些状态(如果有)。最好的方法是什么?我猜我不能只将二进制文件发送到我的 sp,但我不确定。

我也不明白如果枚举中的值超过 7 个,标志将如何工作?

【问题讨论】:

    标签: .net vb.net enums flags


    【解决方案1】:

    为什么是 7 个值?标准整数是 32 位长。您可以将 long 用于 64 位。如果它是一个 64 位的应用程序,你可以有一个 128 位的长度。如果您不关心数据库内部的可读性,则没有理由不能将值作为 int 或 bigint 存储在数据库中。

    此外,如果你用 HEX 表达你的价值观,那么保持 2 的幂会更容易:

    Value1 = 0x1
    Value2 = 0x2
    Value3 = 0x4
    Value4 = 0x8
    Value5 = 0x10
    Value6 = 0x20
    

    要将每个值单独插入到数据库中,您需要为数据库中的每个标志创建一个整数字段,然后在插入时执行以下操作:

    flag1 = (int)flagEnumValue & (int) flagEnum.Value1
    flag2 = (int)flagEnumValue & (int) flagEnum.Value2
    

    这是一个按位与,您可以阅读有关here的信息

    【讨论】:

    • 当然,这是有道理的。存储在数据库中的详细信息可能是 1 或 2。我想构造一个过滤器,以便可以查询 1、2 或两者。你能建议吗?
    • 啊,在这种情况下,您可能希望为每个标志值创建一个单独的字段并使用位掩码插入。我会编辑我的答案给你看
    • 谢谢,但数据库不存储组合,每行将有 1 个状态。这是为了过滤。我希望每个状态在 UI 上都有一个复选框,勾选它意味着在数据库中搜索该状态。
    • 您可以只使用 2 个表。 1 个表可能具有可能的设置值及其在程序中的整数值。另一个可能有它应用的对象以及 1 或 0(开或关)。然后要取回一个值,您只需将值字段乘以正确的可能设置字段。
    • 有道理,我会试一试。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 2022-01-08
    • 2013-12-06
    • 2019-04-20
    相关资源
    最近更新 更多