我需要创建一个将用作位标志的大型枚举。使用标准加倍,即 1、2、4 来确保任何组合的唯一性都很好,除非我使用 int(20 亿上限)时会用完数字。我也不能使用大整数,因为 Sql 服务器对按位运算有限制,并且会截断为 10 个字符。
我想知道的是如何将负数也放入其中,并仍然确保所有组合保持唯一。(例如,ADO.NET 库中使用的一些枚举值似乎具有负整数)。
我需要创建一个将用作位标志的大型枚举。使用标准加倍,即 1、2、4 来确保任何组合的唯一性都很好,除非我使用 int(20 亿上限)时会用完数字。我也不能使用大整数,因为 Sql 服务器对按位运算有限制,并且会截断为 10 个字符。
我想知道的是如何将负数也放入其中,并仍然确保所有组合保持唯一。(例如,ADO.NET 库中使用的一些枚举值似乎具有负整数)。
您可以基于 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
它所代表的基于 - 的枚举重新水化。