如果我有一个选中了所有值之和的数字,如何知道选中了哪个复选框?
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
我有一个现有的数据库,我的 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