有没有办法使用一堆位(或一个字节)而不是一堆布尔值?

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;不要过于复杂,只需将值存储为布尔值。过早的优化是个坏主意。