来自布尔人的锻炼

时间:2011-10-30 03:03:34

标签: c# asp.net-mvc-3

这是我想要做的。

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

已归档(位) 删除(位)

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

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

class Person {

Int32 Status {get;set;}

}

如果已存档 = true,请将状态设置为1,

如果已删除 = true,请将状态设置为2,

如果两者都为false,请将状态设置为0。

我想在使用If语句时这样做,也许我可以使用某种布尔算法?

2 个答案:

答案 0 :(得分: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;
        }
    }
}

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

int x = (int)person.Status;

如果你有一个int,你可以这样做。

person.Status = (PersonState)integerValue;

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

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

答案 1 :(得分:2)

你可以写Convert.ToInt32(Archived) + 2 * Convert.ToInt32(Deleted)

然而,。使用if将导致代码更易读,并且可能会更快一些。