【问题标题】:Is there a way to use a bunch of bits (or one byte) instead of a bunch of booleans?有没有办法使用一堆位(或一个字节)而不是一堆布尔值?
【发布时间】:2018-11-12 20:55:07
【问题描述】:

我目前正在考虑一种将复选框值(真/假)存储在数据库中的方法,而无需为每个复选框使用布尔列。有没有办法将它们存储在一个字节中,其中包含六个复选框的信息?

例如:
* 复选框 1 到 6 全部未选中将是 00000000
* 复选框 1 到 6 全部选中将是 00111111
* 复选框 1 选中,其余未选中将是 00000001
* 选中复选框 3 和 4,其余未选中将是 00001100
* 等等。

编辑前:“最后将有一个字节列,并且对于每一行,选中/未选中复选框的不同组合。”

编辑后:哦,我知道我一直不清楚。我并不是说每个可能的复选框组合都存储在表中的不同行中,就像查找表一样。更像是,整个表格包含来自公式中用户条目的信息,并且用户选中的复选框只是表单的一个元素(db 行的一列)。因此,表单(一行)的每个用户条目可以在复选框列中包含不同的字节。但是如果更多的用户选择相同的复选框,那么他们行中的字节当然会看起来相同。

作为一堆布尔列(每个复选框一个)的替代方案是否有意义?

有没有更好的方法来处理数据库中的复选框值?

有没有办法在 C# 中手动设置字节的每一位?我似乎找不到有关如何执行此操作的解释。

【问题讨论】:

标签: c# database checkbox byte bit


【解决方案1】:

你必须定义字节的枚举大小,并且必须有一个属性标志属性。

这是它的示例代码:

[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;

当你写这个一个字节大小的枚举值时,你会得到你想要的结果。

毕业生

【讨论】:

  • 非常感谢,我会试试这个! :)
  • @Vitriol,我觉得您的问题实际上是关于数据库存储的。如果是这样,您应该使用TSQL Bit datatype,这样您可以将值视为bools,避免按位运算,MS SQL Server 将透明地优化存储。
【解决方案2】:

您可以存储单个字节并将不同的值映射到被选中的复选框。 IE: 00000000 未检查任何按钮,00111111 已检查所有 6 个按钮。不过,这将是很多额外的工作,并且不符合良好的设计原则。

如果持久按钮状态很重要,那么我建议您创建一个名为 buttonstate 的表,将每个按钮的状态存储为一行。这将降低复杂性并让您的应用程序能够更好地扩展,使代码更易于管理,并带来许多其他好处。

TLDR;不要过于复杂,只需将值存储为布尔值。过早的优化是个坏主意。

【讨论】:

  • 您好,感谢您的回答!显然我在我的问题中解释了一些错误,我试图让它更清楚。我的意图不是在表格中包含这些复选框的所有可能组合,并将其称为“复选框可能性”或其他东西。复选框信息只是整个公式信息的一部分。每个用户条目都存储在一行中,并且“选中了哪些复选框?”是一列。
猜你喜欢
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2020-01-11
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
相关资源
最近更新 更多