如果我有一个选中了所有值之和的数字,如何知道选中了哪个复选框?

How to know which checkbox are selected if I have a number with the sum of all values checked?

我有一个现有的数据库,我的 table 有一个字段,其中存储了一个值,即我的复选框列表中所有 "values" 的总和。

另一个程序员制作了这个方法,称之为"logic sum"。我不知道这个方法,但现在我需要知道反向方法,所以我可以通过它们所有值的 Sum 值知道选中了哪些复选框。

我真的不知道该怎么做...我在 asp.net 中使用 C#,但是所有语言的逻辑应该是相同的。

你能帮帮我吗?

你知道如何使用 flags 吗?
为了使这种逻辑求和方法可逆,它必须使用与标志枚举相同的原则:每个可能的复选框组合必须产生一个唯一的数字。

我猜没有那么多复选框,编号如下: 1, 2, 4, 8, 16, 32...等。这样任何组合都会产生一个数字,逻辑和将是可逆的。

通常这些事情是用 2 的幂来完成的...第一个复选框的 "weight" 为 1,第二个复选框的 "weight" 为 2,第三个复选框为 "weight" 的 4 等等。

您可以通过

检查复选框是否被选中
if ((sum & 1) != 0) // first is checked
if ((sum & 2) != 0) // second is checked
if ((sum & 4) != 0) // third is checked

bool firstIsChecked = (sum & 1) != 0;
bool secondIsChecked = (sum & 2) != 0;
bool thirdIsChecked = (sum & 4) != 0;

等等。

如果您不喜欢二进制数学,您可以通过 enum 来利用 Enum.HasFlag 方法:

[Flags]
public enum MyChechboxes
{
    FooCheckbox = 1,
    BarCheckbox = 2,
    BazCheckbox = 4,
}

int sum = 5;

MyChechboxes checkeds = (MyChechboxes)sum;

bool firstIsChecked = checkeds.HasFlag(MyChechboxes.FooCheckbox);
bool secondIsChecked = checkeds.HasFlag(MyChechboxes.BarCheckbox);
bool thirdIsChecked = checkeds.HasFlag(MyChechboxes.BazCheckbox); 

假设您的公司有 5 个特征(A、B、C、D、E)

节省..

if(A.isChecked)

  features = features | 1;

if(B.isChecked)

  features = features | 2;

if(C.isChecked)

  features = features | 4;

if(D.isChecked)

  features = features | 8;

if(E.isChecked)

  features = features | 16;

在你的数据库中存储特征值。

加载中..

从数据库中获取价值

if(特征&1)

A is checked

如果(特征&2)

B is checked

如果(特征&4)

C is checked

if(特征&8)

D is checked

if(特征&16)

E is checked