来自布尔人的锻炼

xqw*_*zid 0 c# asp.net-mvc-3

这是我想要做的.

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

存档(位)已删除(位)

我想做的是根据他们的vaules计算一个int.

作为一个例子,这将在我的模型中:

class Person {

Int32 Status {get;set;}

}
Run Code Online (Sandbox Code Playgroud)

如果Archived = true,则将状态设置为1,

如果Deleted = true,则将状态设置为2,

如果两者都为假,则将状态设置为0.

我想用if语句做这个,​​也许我可以使用某种布尔算法?

Sal*_*iti 5

为什么不使用枚举?

[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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以直接将枚举值转换为整数.

int x = (int)person.Status;
Run Code Online (Sandbox Code Playgroud)

如果你有一个int,你可以做相反的事情.

person.Status = (PersonState)integerValue;
Run Code Online (Sandbox Code Playgroud)

此外,如果您没有提供Deleted和Archived可以共存的可能性,这实际上是布尔值的可能性.由n个布尔值编码的可能值的数量是2 ^ n,因此,由于您有2个布尔值,因此您有4个可能的值,00,01,10和11.

问题在于问题本身:用布尔值编码信息是错误的.它应该是一个枚举,在DB中也只有3个可能的值.