有没有办法使用一堆位(或一个字节)而不是一堆布尔值?
Is there a way to use a bunch of bits (or one byte) instead of a bunch of booleans?
我目前正在考虑一种在数据库中存储复选框值 (true/false) 的方法,而无需为每个复选框使用布尔列。有没有办法将它们存储在一个包含信息的字节中,比方说,六个复选框?
例如:
* 复选框 1 到 6 全部未选中将为 00000000
* 复选框 1 到 6 全部选中将是 00111111
* 选中复选框 1,其余未选中将为 00000001
* 选中复选框 3 和 4,其余未选中将是 00001100
*等
编辑前:"In the end there would be one byte column and for each row a different combination for checkboxes checked/unchecked."
编辑后:哦,我明白我一直不清楚。我并不是说每个可能的复选框组合都存储在不同行的 table 中,就像查找 table 一样。更像是,整个 table 包含来自用户在公式中输入的信息,而用户选中的复选框只是表单的一个元素(数据库行的一列)。因此,表单(一行)的每个用户条目都可以在复选框列中包含不同的字节。但是如果更多的用户选择了相同的复选框,他们行中的字节当然看起来是一样的。
作为一堆布尔列(每个复选框一个)的替代方案是否有意义?
是否有更好的方法来处理数据库中的复选框值?
有没有办法在 C# 中手动设置一个字节的每一位?我似乎找不到有关如何执行此操作的解释。
您必须定义字节的枚举大小,并且必须具有属性 FlagAttribute。
这是它的示例代码:
[Flags]
public enum BitFields : byte
{
CheckBox_01 = 0,
CheckBox_02 = 1 << 0,
CheckBox_02 = 1 << 1,
CheckBox_02 = 1 << 2,
CheckBox_02 = 1 << 3,
CheckBox_02 = 1 << 4,
CheckBox_02 = 1 << 5
}
如果像在 C++ 中一样,您可以在我们之后:
BitFields bits = BitFields.None;
bits |= BitFields.CheckBox_01| BitFields.CheckBox_01;
bits &= ~BitFields.CheckBox_04;
当你写这个一个字节大小的枚举值时,你会得到你想要的结果。
注册
您可以存储单个字节并将不同的值映射到被选中的复选框。 IE:00000000 没有按钮被选中,00111111 所有 6 个按钮都被选中。但这将是很多额外的工作,并且不遵循良好的设计原则。
如果持续的按钮状态很重要,那么我建议您创建一个名为 buttonstate 的 table,将每个按钮的状态存储为一行。这将降低复杂性并允许您的应用程序更好地扩展,使代码更易于管理,以及其他许多好处。
TLDR;不要过于复杂,只需将值存储为布尔值。过早的优化是个坏主意。
我目前正在考虑一种在数据库中存储复选框值 (true/false) 的方法,而无需为每个复选框使用布尔列。有没有办法将它们存储在一个包含信息的字节中,比方说,六个复选框?
例如:
* 复选框 1 到 6 全部未选中将为 00000000
* 复选框 1 到 6 全部选中将是 00111111
* 选中复选框 1,其余未选中将为 00000001
* 选中复选框 3 和 4,其余未选中将是 00001100
*等
编辑前:"In the end there would be one byte column and for each row a different combination for checkboxes checked/unchecked."
编辑后:哦,我明白我一直不清楚。我并不是说每个可能的复选框组合都存储在不同行的 table 中,就像查找 table 一样。更像是,整个 table 包含来自用户在公式中输入的信息,而用户选中的复选框只是表单的一个元素(数据库行的一列)。因此,表单(一行)的每个用户条目都可以在复选框列中包含不同的字节。但是如果更多的用户选择了相同的复选框,他们行中的字节当然看起来是一样的。
作为一堆布尔列(每个复选框一个)的替代方案是否有意义?
是否有更好的方法来处理数据库中的复选框值?
有没有办法在 C# 中手动设置一个字节的每一位?我似乎找不到有关如何执行此操作的解释。
您必须定义字节的枚举大小,并且必须具有属性 FlagAttribute。
这是它的示例代码:
[Flags]
public enum BitFields : byte
{
CheckBox_01 = 0,
CheckBox_02 = 1 << 0,
CheckBox_02 = 1 << 1,
CheckBox_02 = 1 << 2,
CheckBox_02 = 1 << 3,
CheckBox_02 = 1 << 4,
CheckBox_02 = 1 << 5
}
如果像在 C++ 中一样,您可以在我们之后:
BitFields bits = BitFields.None;
bits |= BitFields.CheckBox_01| BitFields.CheckBox_01;
bits &= ~BitFields.CheckBox_04;
当你写这个一个字节大小的枚举值时,你会得到你想要的结果。
注册
您可以存储单个字节并将不同的值映射到被选中的复选框。 IE:00000000 没有按钮被选中,00111111 所有 6 个按钮都被选中。但这将是很多额外的工作,并且不遵循良好的设计原则。
如果持续的按钮状态很重要,那么我建议您创建一个名为 buttonstate 的 table,将每个按钮的状态存储为一行。这将降低复杂性并允许您的应用程序更好地扩展,使代码更易于管理,以及其他许多好处。
TLDR;不要过于复杂,只需将值存储为布尔值。过早的优化是个坏主意。