C# 来自布尔人的训练整数

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(已

这就是我要做的

我的数据库中有两个位字段:

存档(bit) 已删除(位)

我想做的是根据它们的值计算一个int

例如,在我的模型中:

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个可能的值。