0

我需要创建一个将用作位标志的大型枚举。使用标准加倍,即 1、2、4 来确保任何组合的唯一性都很好,除非我使用 int(20 亿上限)时会用完数字。我也不能使用大整数,因为 Sql 服务器对按位运算有限制,并且会截断为 10 个字符。

我想知道的是如何将负数也放入其中,并仍然确保所有组合保持唯一。(例如,ADO.NET 库中使用的一些枚举值似乎具有负整数)。

4

1 回答 1

4

您可以基于 a 创建枚举ulong

[Flags]
enum Foo : ulong
{
  A = 1 ,
  B = 2 ,
  C = 4 ,
  . . .
}

将其作为两个整数存储在数据库中,如下所示:

Save( Foo value )
{
  ulong bitfield = (ulong) value ;
  int hiNibble = (int)( (bitfield>>32) & 0x00000000FFFFFFFF ) ;
  int loNibble = (int)( (bitfield>>0)  & 0x00000000FFFFFFFF ) ;

  // store the hi and lo nibbles as two integer columns in your database

}

在您的数据库中,将表创建为

create table dbo.some_table
(
  hiNibble int ,
  loNibble int ,
  bitField as convert(bigint, convert(varbinary,hiNibble) + convert(varbinary,loNibble) )
)

现在你有两个 32 位整数,你可以在 SQL 中旋转,你有一个 64 位整数,你可以传回你的 C# 代码并作为ulong它所代表的基于 - 的枚举重新水化。

于 2013-11-12T02:43:06.977 回答