C# 来自布尔人的训练整数
这就是我要做的 我的数据库中有两个位字段: 存档(bit) 已删除(位) 我想做的是根据它们的值计算一个int 例如,在我的模型中:C# 来自布尔人的训练整数,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,这就是我要做的 我的数据库中有两个位字段: 存档(bit) 已删除(位) 我想做的是根据它们的值计算一个int 例如,在我的模型中: class Person { Int32 Status {get;set;} } 如果存档=true,则将状态设置为1 如果已删除=true,则将状态设置为2 如果两个都为false,则将状态设置为0 我想在不使用If语句的情况下实现这一点,也许我可以使用某种布尔运算?您可以编写Convert.ToInt32(已存档)+2*Convert.ToInt32(已
class Person {
Int32 Status {get;set;}
}
如果存档=true,则将状态设置为1
如果已删除=true,则将状态设置为2
如果两个都为false,则将状态设置为0
我想在不使用If语句的情况下实现这一点,也许我可以使用某种布尔运算?您可以编写
Convert.ToInt32(已存档)+2*Convert.ToInt32(已删除)
但是,不要。如果使用if
s,代码的可读性会大大提高,而且速度可能也会更快。为什么不使用枚举
[Flags]
public enum PersonState
{
None = 0,
Archived = 1,
Deleted = 2,
Both = Archived | Deleted
}
class Person
{
private PersonState status;
public PersonState Status
{
get { return this.status; }
set { this.status = value; }
}
public bool IsArchived
{
get
{
return (this.status & PersonState.Archived) != 0;
}
set
{
if (value)
this.status |= PersonState.Archived;
else
this.status &= ~PersonState.Archived;
}
}
public bool IsDeleted
{
get
{
return (this.status & PersonState.Deleted) != 0;
}
set
{
if (value)
this.status |= PersonState.Deleted;
else
this.status &= ~PersonState.Deleted;
}
}
}
可以直接将枚举值强制转换为整数
int x = (int)person.Status;
如果你有一个int,你可以做相反的事情
person.Status = (PersonState)integerValue;
此外,如果您不提供删除和存档可以共存的可能性,那么实际上这是布尔值的可能性。
由n个布尔值编码的可能值的数量是2^n,因此,由于有2个布尔值,因此有4个可能值,00、01、10和11
问题在于问题本身:用布尔编码信息是错误的。它应该是一个在数据库中也只有3个可能值的枚举。这两个值永远都不是真的,它们必须是一个或另一个。为什么不使用
枚举
?在我看来,enum Status{Normal,archive,Deleted}
会更容易理解。好的,我该如何将其写入enum?但是IsArchived和IsDeleted需要从数据库中进行初始设置,如何将其导入到作品中?刚刚编辑,在这种情况下,您可以在EnUM和布尔属性中访问读和写。注意,在这种情况下,在我写的时候,都意味着归档和删除,而没有意味着没有归档和删除。如果<代码> < < /代码>不是您想考虑的可能性,我将删除<代码> [FLAG] < /C>标签,<代码> < < /代码>值,并将其保留为枚举。如果希望同时设置这两个标志,则只应将其保留为[Flags]
。是的,但问题是,如果删除标志,如果尝试使用二进制算术进行写入,当然会出现编译器错误,因为它将为您提供不允许的值。在这种情况下,需要对整数执行强制转换。问题在于问题本身:在数据库中用布尔编码信息是错误的,它应该是一个枚举,在数据库中也只有3个可能的值。